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是支持的论点,对吗?