Ocaml 编写筛选器谓词:“引用”;表达式的类型为int。。应为“bool”类型;

Ocaml 编写筛选器谓词:“引用”;表达式的类型为int。。应为“bool”类型;,ocaml,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 现在我正在编写一个谓词,它可

因此,我编写了一个函数“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
现在我正在编写一个谓词,它可以传递给过滤器,以保持5的倍数

let multiples_of_five_pred: int -> bool =
filter (fun (x: int) -> x mod 5)

我不知道我在这里遗漏了什么…我得到了一个语法错误,它说“这个表达式有int类型,但是一个表达式应该是bool类型”

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

指定给
过滤器的函数需要生成布尔值,但正如错误消息所告诉您的,指定给
过滤器的函数生成的是整数,而不是布尔值。您需要将其更改为生成布尔值

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


还要注意的是,您说,
multiples\u of_five\u prod
应该是一个赋予
filter
的函数,但实际上您在函数内部调用了
filter
。那不合适。您应该删除对
过滤器的调用

好吧,我要说的是,他已经收到了一条指示确切问题的消息:-)诀窍(可能)是相信编译器。我不认为一定不鼓励使用类型注释。问题不在于第二个函数的类型错误。它根本没有类型-它的类型不好。无论是否使用类型注释,它都无法编译。此外,删除类型注释很少会产生更有用的错误消息,在这种情况下,错误消息根本不会改变。那么,编译器想说什么呢D