我有一个' a和一个&b; b的列表,以及'a -> 'b-> 'c
类型的函数。我试图用我已经拥有的b将该函数应用于a-list的每个元素,并列出' c。在haskell中,我会做zipWith(foobar) a-list (replicate (length a) b).
之类的事情。
在OCaml中执行此操作的等效方法是什么?
答案 0 :(得分:8)
嗯,在您的示例中,您并不真正需要zipWith
,您可以使用简单的map
:
List.map (fun a -> f a b) a_list
这比List.map2
(相当于zipWith
)更有效,因为OCaml不像Haskell那样处理列表,因此只是为了构造一个虚拟列表迭代并不值得。
答案 1 :(得分:7)
" List.map2"相当于Haskell" zipWith"
val map2 : ('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list
答案 2 :(得分:1)
OCaml中的等价物是:
open Core_kernel.Std
let replicate n b = List.init n ~f:(fun _ -> b)
List.(map2_exn a (replicate (length b) b) ~f:your_function)
然而,这段代码几乎没有提出任何问题。比如,您确定要将列表作为函数的第二个参数吗?并且,正如@PatJ建议的那样,复制第二个参数而不是将其作为自由变量传递给函数的原因是什么。并不是所有关于懒惰与急切的评价。在Haskell中,您仍然需要遍历列表,b
将遍历两次。计算是懒惰的事实并不意味着它在评估时会更快。
但是,OCaml的核心库仍然提供了一个名为Sequence
的惰性列表,其行为类似于Haskell的行为。代码将是相同的,以模块名称为模,即只用List
替换Sequence
。