在OCaml中相当于haskell的zipwith

时间:2015-01-30 16:32:03

标签: haskell ocaml

我有一个' a和一个&b; b的列表,以及'a -> 'b-> 'c类型的函数。我试图用我已经拥有的b将该函数应用于a-list的每个元素,并列出' c。在haskell中,我会做zipWith(foobar) a-list (replicate (length a) b).之类的事情。 在OCaml中执行此操作的等效方法是什么?

3 个答案:

答案 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