【问题标题】:OCaml: List mapping a function with 2 inputsOCaml:列表映射具有 2 个输入的函数
【发布时间】:2014-05-18 15:52:41
【问题描述】:

我有一个函数 sqrt,它接受 2 个浮点值、容差和数字,并在指定的容差内给出数字的平方根。我用近似法来做。

let rec sqrt_rec approx tol number =
..................;;
let sqrt tol x = sqrt_rec (x/.2.0) tol x;;

我有另一个函数映射,它接受一个函数和一个列表,并将该函数应用于列表的所有元素。

let rec map f l = 
match l with
[] -> []
| h::t -> f h::map f t;;

现在我正在尝试创建另一个函数 all_sqrt,它基本上采用 1 个浮点值、1 个浮点列表并将函数 sqrt 映射到所有元素。

let all_sqrt tol_value ip_list = List.map sqrt tol_value ip_list;;

这显然给了我错误。我尝试使 tol_value 也成为一个列表,但它仍然会引发错误。 错误:此函数应用于太多参数; 也许你忘记了一个`;'

我认为我做错了映射。

【问题讨论】:

    标签: ocaml


    【解决方案1】:

    List 模块包含

    val map2 : ('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list
    

    这样使用:

    let all_sqrt tol_value ip_list = List.map2 sqrt tol_value ip_list
    

    【讨论】:

    • 我无法使用 map2。无论如何,我想出了解决方案。谢谢。
    【解决方案2】:

    这听起来像是作业,因为您说您的解决方案仅限于某些功能。所以我会尽量给出一些建议,而不是答案。

    您希望对列表中的所有值使用相同的容差。想象一下,如果有一种方法可以将容差与您的 sqrt 函数相结合,以生成一个只需要一个参数的新函数。你有float -> float -> float 类型的东西,并且你想提供第一个浮点数。这会给你一个float -> float 类型的函数。 (正如 Wes 所指出的,这很有效,因为您的 sqrt 函数是以 Curried 形式定义的。)

    我只能说像 OCaml(和 Haskell)这样的 FP 语言在这方面做得非常好。事实上,要做到这一点有点困难,只要你注意各种事情的优先级。 (即,考虑括号。)

    【讨论】:

      【解决方案3】:

      我不知道 O'Caml,但我知道 Haskell,在我看来,您正在将 map 应用于 3 个参数“sqrt tol_value ip_list” map 只需要两个参数,并且属于 类型('a -> 'b) -> 'a list -> 'b list 这意味着它接受一个函数(函数只接受一个输入并返回一个输出)和一个列表,并返回一个新列表。

      http://en.wikipedia.org/wiki/Currying

      【讨论】:

      • OCaml 中通常没有撇号,因为它不是爱尔兰语。
      猜你喜欢
      • 1970-01-01
      • 2020-08-25
      • 2018-12-30
      • 2016-09-27
      • 1970-01-01
      • 2014-03-28
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      相关资源
      最近更新 更多