编写过滤谓词:“表达式具有类型int ..期望类型为bool”

时间:2013-02-09 16:56:10

标签: ocaml

所以我写了一个函数“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类型”。

2 个答案:

答案 0 :(得分:2)

赋予filter的函数需要产生一个布尔值,但正如错误消息告诉你的那样,你给filter的函数产生一个整数,而不是一个布尔值。您需要更改它以生成布尔值。

修复后,您将遇到另一个类型错误:将filter应用于采用整数的函数将生成类型为int list -> int list的函数,但根据您的类型签名,您需要类型int -> bool

另请注意,您说multiples_of_five_prod应该是filter的函数,但实际上您在函数内部调用了filter。那不合适。您应该删除对filter的调用。

答案 1 :(得分:0)

问题的根源在于您在不需要时使用类型注释。如果你错过了它们(它们不需要),你会更快地看到为什么你的第二个函数没有你期望的类型。