【问题标题】:Writing a filter predicate: "expression has type int .. expected of type bool"编写过滤谓词:“表达式的类型为 int .. 预期为 bool 类型”
【发布时间】:2013-01-25 06:31:24
【问题描述】:

所以我写了一个函数“过滤器”,它应用于输入列表中每个元素的给定谓词,并检查它是否应该包含在输出中。

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 类型”。

【问题讨论】:

  • 那么,编译器想要表达的是什么? :D

标签: ocaml


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 好吧,我会说他已经收到一条表明确切问题的消息:-) 诀窍(也许)是相信编译器。我不认为应该不鼓励使用类型注释。
    • 问题不在于第二个函数的类型错误。它根本没有类型——它是错误的类型。无论有没有类型注释,它都不会编译。此外,删除类型注释很少会导致更有用的错误消息,在这种情况下,错误消息根本不会改变。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多