2013-02-09 24 views
0

因此,我編寫了一個函數「過濾器」,該函數應用於給定的謂詞到輸入列表中的每個元素,並檢查它是否應該包含在輸出。編寫過濾器謂詞:「表達式的類型爲int ..預計爲bool類型」

let rec filer (pred: 'a -> bool) (l: 'a list) : 'a list = 
begin match l with 
| [] -> [] 
| hd :: rest -> if (pred hd) then hd :: (filter pred rest) else filter pred rest 
end 

現在我正在寫一個謂詞,可以傳遞給過濾器以保持5的倍數。

let multiples_of_five_pred: int -> bool = 
filter (fun (x: int) -> x mod 5) 

我不知道我在這裏失蹤...我收到說語法錯誤「這種表達的類型爲int,但預計bool類型的表達式」。

+0

那麼,編譯器試圖說什麼? :D – 2013-02-09 19:19:21

回答

2

filter的函數需要產生一個布爾值,但正如錯誤信息告訴你的,你給filter的函數會產生一個整數,而不是布爾值。你需要改變它來產生一個布爾值。

一旦你解決這個問題,你就會有另一種類型的錯誤:將filter到取整數會產生int list -> int list類型的函數的函數,而是根據你的類型的簽名,你想要的類型int -> bool

另外請注意,你說multiples_of_five_prod應該是一個功能就是給到filter,但實際上你叫filter裏面的功能。這不適合。您應該刪除對filter的呼叫。

0

問題的根源在於當您不需要時使用類型註釋。如果你錯過了它們(它們不是必需的),你會更快地看到爲什麼你的第二個函數沒有你期望的類型。

+2

那麼,我會說他已經得到了一個消息,指出確切的問題:-)訣竅(也許)是相信編譯器。我不認爲應該不鼓勵使用類型註釋。 – 2013-02-09 17:03:32

+2

問題不在於第二個函數的類型錯誤。它根本沒有類型 - 它是不正確的。它不會編譯有或沒有類型註釋。另外刪除類型註釋很少導致更有用的錯誤消息,在這種情況下,錯誤消息根本不會改變。 – sepp2k 2013-02-09 19:14:10

相關問題