2017-09-10 11 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"は、定義した関数の名前ではありません。

最初のエラーのために2番目のエラーが奇妙に見えます。_タイプはisCapitalを指します。あなたが最初のエラーを修正する場合は、2番目は、コンパイラが言おうとしている何より

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

のようになります
は、あなたがそれをタイプ'Z -> boolの機能を期待filterにペア(isCapitalized,strs)を渡しているということです。

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

ありがとうございます。カレーリングを完全に忘れてしまった。 –

関連する問題