>我创建了一个函数p
,用于检查给定值的平方是否小于30
。 然后在另一个函数(作为参数(中调用此函数以返回列表中的第一个值,其平方小于 30(如果 p 为真,基本上我必须检查函数p
是true
还是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)
这一行使类型检查器推断出find
的p
参数是一个接受一个参数(此处listT
(并返回另一个类型为int -> bool
的函数的函数。
这是查看问题的另一种方法,正如@octachron所说。
如果你假设p
是类型int -> bool
的函数,那么这个递归调用:
support (p listT)
传递布尔值作为support
的第一个参数。这没有多大意义,因为support
的第一个参数应该是一个函数。
同一表达式的另一个问题是它要求listT
是int
类型的值(因为这是p
期望的参数(。但listT
是一个整数列表,而不是整数。
此表达式的第三个问题是它只将一个参数传递给support
。但support
期待两个参数。
幸运的是,所有这些问题的解决方法都非常简单。