列表 Ocaml 上的高阶函数



>我创建了一个函数p,用于检查给定值的平方是否小于30。 然后在另一个函数(作为参数(中调用此函数以返回列表中的第一个值,其平方小于 30(如果 p 为真,基本上我必须检查函数ptrue还是false(。

这是代码:

let p numb = 
let return = (numb * numb) < 30 in return
let find p listT =
let rec support p listT =
match listT with
| []-> raise (Failure "No element in list for p")
| hd :: tl -> if p hd then hd
else support p tl in
let ret = support (p listT) in ret
let () =
let a = [5;6;7] in
let b = find p a in print_int b

但它在最后一行说:

Error: This expression (p) has type int -> bool
but an expression was expected of type int -> 'a -> bool
Type bool is not compatible with type 'a -> bool 

但是,我认为我没有以正确的方式使用高阶函数,我认为它应该更自动,或者不是?

首先,请注意

let return = x in return

可以替换为

x

其次,您的原始错误在第 10 行

support (p listT)

这一行使类型检查器推断出findp参数是一个接受一个参数(此处listT(并返回另一个类型为int -> bool的函数的函数。

这是查看问题的另一种方法,正如@octachron所说。

如果你假设p是类型int -> bool的函数,那么这个递归调用:

support (p listT)

传递布尔值作为support的第一个参数。这没有多大意义,因为support的第一个参数应该是一个函数。

同一表达式的另一个问题是它要求listTint类型的值(因为这是p期望的参数(。但listT是一个整数列表,而不是整数。

此表达式的第三个问题是它只将一个参数传递给support。但support期待两个参数。

幸运的是,所有这些问题的解决方法都非常简单。

最新更新