0

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

4

2 回答 2

2

给定的函数filter需要产生一个布尔值,但正如错误消息告诉您的那样,您给定的函数会filter产生一个整数,而不是布尔值。您需要将其更改为生成布尔值。

一旦你解决了这个问题,你就会遇到另一个类型错误:应用filter到一个接受整数的函数将产生一个 type 的函数int list -> int list,但根据你的类型签名,你需要 type int -> bool

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

于 2013-02-09T19:20:33.003 回答
0

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

于 2013-02-09T17:01:05.067 回答