2011-01-10 26 views
3

数値を指定してリストを作成すると、リストにその値に基づいて正しい位置に番号が挿入された新しいリストが返されます。 (私は挿入ソートをやっている。)リスト内の項目の比較

let rec insertinto number numbers = 
    match numbers with 
    | [] -> [number] 
    | head::tail -> if head > number then number::numbers else head::(insertinto number tail) 

F#は、このメソッドの型があることを推測:

val insertinto : 'a -> 'a list -> 'a list when 'a : comparison 

私は

を取得し、私は

[4; 10; 15] |> insertinto 12 

でこのメソッドをテストする場合

val it : int list = [4; 12; 10; 15] 

明らかに間違っています。比較 'head> number'が正しく動作していません。

それを動作させるために、私は数字パラメータの型を指定する必要があります。そして、

let rec insertinto number numbers: int list = 

それすべての作品が、私は、私は仕事にこれをしたい、int型のリストにすべての時間を使用したくありませんどのようなタイプのリストでもよい。型が比較を実装する限り、確かに動作するはずです。

なぜこれはintリストで動作し、汎用リストでは機能しませんか?私は何が欠けていますか?

編集

okが、これはモノラルのみの問題であるように思われます。

+3

私のための作品...どのようなプラットフォームを使用していますか? – kvb

+2

元の関数は、型宣言なしで、うまく動作します。偶然、fsiでVisual Studioでこれをやっていますか?私はVisual Studioを使用してテキストを選択し、alt-enterを使用してfsiウィンドウに送りますが、時にはエラーが発生してVSエディタで更新しますが、fsiに再度送り返すことを忘れてしまいます。したがって、2つは同期しておらず、fsiで関数を再実行すると少し不快になることがあります(特に、朝曜の朝の最初のもの)。あなたは見ている動作を確実に再現できますか? – Juliet

+1

それは面白いです。私はMacでMonodevelopでこれをやっています。 –

答えて

3

Mono(バージョン2.8)を使用してMacでコードをテストしただけで、最新のF#統合でMonoDevelopが機能し、最初の機能(タイプ注釈なし)は期待通りに機能します。

しかし、これがMonoの以前のバージョンのバグであったとしても、あまり驚くことはありません。 2.6.xにはさまざまな問題がありました。間違った結果を与えるのは奇妙なエラーです(いくつかのエラーメッセージやクラッシュが一般的でした)が、何らかの問題によって引き起こされる可能性があります。 Monoのバージョンを確認できますか?

私はこれを使用していますし、それが正常に動作します:

fsmac:~ tomaspetricek$ mono -V 
Mono JIT compiler version 2.8 (tarball Thu Oct 7 12:23:27 MDT 2010) 
Copyright (C) 2002-2010 Novell, Inc and Contributors. www.mono-project.com 

あなたはモノラル2.6.xの上実行のF#、非常にしたジェネリックで多くの問題を修正2.8を(使用することをお勧めしますすることができますが、 F#のためのブロック)

+0

事を説明するああ。私は2.6.7にあった。更新がそれをソートしました。(btwそれはあなたの問題を解決することを大変光栄に思っています。私は徹底的にFunctional Programmingの本を楽しんでいます! –

関連する問題