所以我写了一个函数“filter”,它应用于输入列表中每个元素的给定谓词,并检查它是否应该包含在输出中。
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
现在我正在写一个可以传递给过滤器的谓词,只保留五的倍数。
let multiples_of_five_pred: int -> bool =
filter (fun (x: int) -> x mod 5)
我不知道我在这里缺少什么...我收到一个语法错误,说“这个表达式有int类型,但表达式是bool类型”。
答案 0 :(得分:2)
赋予filter
的函数需要产生一个布尔值,但正如错误消息告诉你的那样,你给filter
的函数产生一个整数,而不是一个布尔值。您需要更改它以生成布尔值。
修复后,您将遇到另一个类型错误:将filter
应用于采用整数的函数将生成类型为int list -> int list
的函数,但根据您的类型签名,您需要类型int -> bool
。
另请注意,您说multiples_of_five_prod
应该是给到filter
的函数,但实际上您在函数内部调用了filter
。那不合适。您应该删除对filter
的调用。
答案 1 :(得分:0)
问题的根源在于您在不需要时使用类型注释。如果你错过了它们(它们不需要),你会更快地看到为什么你的第二个函数没有你期望的类型。