我正在尝试在ML中编写一个简单的过滤函数。我们的想法是函数only_capitals
获取一个字符串列表并返回一个字符串列表,只有以大写字母开头的字符串。这是我的实现,但是我收到了一个我不理解的类型错误:
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 :(得分: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