2017-09-10 39 views
-2

我想在ML中編寫一個簡單的過濾函數。這個想法是函數only_capitals接受一個字符串列表並返回一個字符串列表,只有以大寫字母開頭的字符串。下面是我的實現,但我得到一個類型錯誤,我不明白:ML List.filter中的類型不匹配

fun only_capitals (strs : string list) = 
    let 
    fun isCapitalized (str) = Char.isUpper(String.sub(str, 0)) 
    in 
    List.filter(isCapital, strs) 
    end 

以下是錯誤:

hw3provided.sml:5.18-5.27 Error: unbound variable or constructor: isCapital 
hw3provided.sml:5.6-5.34 Error: operator and operand don't agree [tycon mismatch] 
    operator domain: 'Z -> bool 
    operand:   _ * string list 
    in expression: 
    List.filter (<errorvar>,strs) 
val it =() : unit 
+0

那麼,有什麼錯誤? – melpomene

回答

2

第一個錯誤是由一個錯字造成的; 「isCapital」不是您定義的函數的名稱。

第二個錯誤看起來很奇怪,因爲第一個錯誤 - 類型_指的是isCapital的類型。
如果解決的第一個錯誤,第二個應該看起來更像

Error: operator and operand don't agree [tycon mismatch] 
    operator domain: 'Z -> bool 
    operand:   (string -> bool) * string list 
    in expression: 
    List.filter (isCapitalized,strs) 

什麼編譯器想說的是,你傳遞對(isCapitalized,strs)filter它預計'Z -> bool類型的函數。

如果你look at the type of List.filter,你會發現它是('a -> bool) -> 'a list -> 'a list - 這是一個咖喱飯功能。

你應該寫什麼是

fun only_capitals (strs : string list) = 
    let 
    fun isCapitalized (str) = Char.isUpper(String.sub(str, 0)) 
    in 
    List.filter isCapitalized strs 
    end 
+0

謝謝。完全忘記了咖喱。 –