列表 Ocaml 上的高阶函数
Higher order function on lists Ocaml
我创建了一个函数 p
,用于检查给定值的平方是否小于 30
。
然后在另一个函数(作为参数)中调用此函数以 return 列表中的第一个值,其平方小于 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
)和 return 另一个类型的函数的函数int -> bool
.
这是查看问题的另一种方式,如@octachron 所说。
如果你假设p
是一个int -> bool
类型的函数,那么这个递归调用:
support (p listT)
正在传递一个布尔值作为 support
的第一个参数。这没有多大意义,因为 support
的第一个参数应该是一个函数。
同一个表达式的另一个问题是它要求 listT
是 int
类型的值(因为这是 p
期望的参数)。但是 listT
是一个整数列表,而不是一个整数。
此表达式的第三个问题是它只将一个参数传递给 support
。但是 support
需要两个参数。
幸运的是,所有这些问题的修复都非常简单。
我创建了一个函数 p
,用于检查给定值的平方是否小于 30
。
然后在另一个函数(作为参数)中调用此函数以 return 列表中的第一个值,其平方小于 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
)和 return 另一个类型的函数的函数int -> bool
.
这是查看问题的另一种方式,如@octachron 所说。
如果你假设p
是一个int -> bool
类型的函数,那么这个递归调用:
support (p listT)
正在传递一个布尔值作为 support
的第一个参数。这没有多大意义,因为 support
的第一个参数应该是一个函数。
同一个表达式的另一个问题是它要求 listT
是 int
类型的值(因为这是 p
期望的参数)。但是 listT
是一个整数列表,而不是一个整数。
此表达式的第三个问题是它只将一个参数传递给 support
。但是 support
需要两个参数。
幸运的是,所有这些问题的修复都非常简单。