Functional programming Ocaml上的高阶函数
我创建了一个函数Functional programming Ocaml上的高阶函数,functional-programming,ocaml,Functional Programming,Ocaml,我创建了一个函数p,用于检查给定值的平方是否小于30。 然后在另一个函数(作为参数)中调用此函数,以返回列表中的第一个值,其平方小于30(如果p为true,基本上我必须检查函数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 | []->
p
,用于检查给定值的平方是否小于30
。
然后在另一个函数(作为参数)中调用此函数,以返回列表中的第一个值,其平方小于30(如果p为true,基本上我必须检查函数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
然而,我认为我没有正确地使用高阶函数,我想它应该更自动,或者不是吗?首先,请注意
let return = x in return
可以替换为
x
第二,您最初的错误在第10行
support (p listT)
这一行使typechecker推断出find
的p
参数是一个函数,它接受一个参数(这里是listT
)并返回另一个int->bool
类型的函数,请注意
let return = x in return
可以替换为
x
第二,您最初的错误在第10行
support (p listT)
这一行使typechecker推断出
find
的p
参数是一个函数,它接受一个参数(这里是listT
)并返回另一个int->bool
类型的函数。下面是另一种看待问题的方法,正如@octachron所说的
如果假定p
是int->bool
类型的函数,则此递归调用:
support (p listT)
正在传递布尔值作为支持的第一个参数。这没有多大意义,因为support
的第一个参数应该是一个函数
这个表达式的另一个问题是,它要求listT
是int
类型的值(因为这是p
所期望的参数)。但是listT
是int的列表,而不是int
此表达式的第三个问题是,它只将一个参数传递给支持
。但是support
需要两个参数
幸运的是,所有这些问题的解决方法都非常简单。这里有另一种看待问题的方法,正如@octachron所说
如果假定p
是int->bool
类型的函数,则此递归调用:
support (p listT)
正在传递布尔值作为支持的第一个参数。这没有多大意义,因为support
的第一个参数应该是一个函数
这个表达式的另一个问题是,它要求listT
是int
类型的值(因为这是p
所期望的参数)。但是listT
是int的列表,而不是int
此表达式的第三个问题是,它只将一个参数传递给支持
。但是support
需要两个参数
幸运的是,所有这些问题的解决方法都非常简单。是的,我注意到了,因为这是我第一次处理高阶函数,所以我正在尽一切努力让它们工作。但有一个问题,ListInput是否用于p?我假设no,p和listT是支持的参数,对吗?是的,我注意到了,因为这是我第一次处理高阶函数,所以我正在尽一切努力使它们工作。但有一个问题,ListInput是否用于p?我假设no,p和listT是支持的论点,对吗?