我有一个函数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也列为一个列表,但它仍然会引发错误。 错误:此函数适用于太多参数; 也许你忘记了一个`;'
我相信我做错了。
答案 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 表示它接受一个函数(函数只接受一个输入并返回一个输出)和一个列表,并返回一个新列表。