列表 Ocaml 上的高阶函数

Higher order function on lists Ocaml

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

这是代码:

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)和 return 另一个类型的函数的函数int -> bool.

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

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

support (p listT)

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

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

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

幸运的是,所有这些问题的修复都非常简单。