2011-01-10 89 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列表,而不是一個通用的列表?我錯過了什麼?

編輯

確定,這似乎是一個僅適用於黑白的問題。

+3

適用於我......您使用的是什麼平臺? – kvb 2011-01-10 17:18:44

+2

您的原始函數,沒有類型聲明,適合我。偶然的機會,你在Visual Studio中用fsi做這個嗎?我喜歡使用Visual Studio,選擇文本,並使用alt-enter將它發送到fsi窗口 - 但是,偶爾會出現錯誤,我在VS編輯器中更新它,但忘記將其重新發回到fsi,所以這兩者不同步,當你在fsi中重新執行函數時(特別是在星期一早上的第一件事情),可能會有點不和諧。你能否可靠地重現你所看到的行爲? – Juliet 2011-01-10 17:40:37

回答

3

我剛剛在Mac上使用Mono(版本2.8)和MonoDevelop測試了最新的F#集成和第一個函數(無類型註釋)的代碼。

但是,如果這是早期版本的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 

雖然可以運行 F#在Mono的2.6.x,強烈建議使用2.8(其中修復了那名泛型許多問題阻止F#)