在ML List.filter中键入Mismatch

时间:2017-09-10 13:14:22

标签: sml

我正在尝试在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

1 个答案:

答案 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