OCaml:列出具有2个输入的函数的映射

时间:2011-08-29 05:22:19

标签: ocaml

我有一个函数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也列为一个列表,但它仍然会引发错误。 错误:此函数适用于太多参数; 也许你忘记了一个`;'

我相信我做错了。

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:1)

这听起来像是家庭作业,因为你说你的解决方案只限于某些功能。所以我会尝试给出一些建议,而不是答案。

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

我只能说,像OCaml(和Haskell)这样的FP语言非常擅长这样做。事实上,只要你介意各种事物的优先级,它就会很难而不是。 (即,考虑括号。)

答案 2 :(得分:0)

我不知道O'Caml,但我知道Haskell,它看起来就像你将地图应用于3个参数“sqrt tol_value ip_list”地图只有两个参数,并且属于 ('a - >'b) - > '列表 - > 'b list 表示它接受一个函数(函数只接受一个输入并返回一个输出)和一个列表,并返回一个新列表。

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