【问题标题】:Higher order function on lists OcamlOcaml 列表上的高阶函数
【发布时间】:2020-06-26 16:45:24
【问题描述】:

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

这是代码:

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 

但是,我认为我没有以正确的方式使用高阶函数,我认为它应该更自动,或者不是?

【问题讨论】:

    标签: functional-programming ocaml


    【解决方案1】:

    首先,请注意

    let return = x in return
    

    可以替换为

    x
    

    其次,你原来的错误在第 10 行

    support (p listT)
    

    这一行使类型检查器推断findp 参数是一个函数,它接受一个参数(此处为listT)并返回另一个int -&gt; bool 类型的函数。

    【讨论】:

      【解决方案2】:

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

      如果假设pint -&gt; bool 类型的函数,那么这个递归调用:

      support (p listT)
      

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

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

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

      幸运的是,所有这些问题的解决方法都非常简单。

      【讨论】:

      • 是的,我注意到了,因为这是我第一次处理高阶函数,所以我正在尽一切努力让它们工作 eheheh。但是有一个问题,是 p 的 listT 输入吗?我假设不是,p 和 listT 是支持的论点吗?
      猜你喜欢
      • 1970-01-01
      • 2015-09-22
      • 1970-01-01
      • 2010-12-31
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多