gpt4 book ai didi

clojure - Clojure Core 或 Contrib 中是否有等效的 Zip 函数?

转载 作者:行者123 更新时间:2023-12-03 00:58:42 25 4
gpt4 key购买 nike

在 Clojure 中,我想组合两个列表以给出一个对列表,

> (zip '(1 2 3) '(4 5 6))  
((1 4) (2 5) (3 6))

在 Haskell 或 Ruby 中,该函数称为 zip。实现它并不困难,但我想确保我没有遗漏 Core 或 Contrib 中的某个功能。

有一个zip Core 中的命名空间,但它是 described作为提供对 Zipper 功能技术的访问,这似乎不是我所追求的。

Core 中是否有一个等效的函数可以以这种方式组合 2 个或多个列表?

如果没有,是否是因为有一种惯用的方法使该函数变得不需要?

最佳答案

(map vector '(1 2 3) '(4 5 6))

做你想做的事:

=> ([1 4] [2 5] [3 6])

Haskell 需要一组 zipWith (zipWith3, zipWith4, ...) 函数,因为它们都需要具有特定的类型;特别是,它们接受的输入列表的数量需要固定。 (zipzip2zip3、... 系列可以视为 zipWith 系列的特化对于元组的常见用例)。

相比之下,Clojure 和其他 Lisp 对变量参数函数有很好的支持; map 就是其中之一,可以以类似于 Haskell 的方式用于“元组”

zipWith (\x y -> (x, y))

在 Clojure 中构建“元组”的惯用方法是构建一个短向量,如上所示。

(只是为了完整起见,请注意,带有一些基本扩展的 Haskell 确实允许变量 arity 函数;不过,使用它们需要对语言有很好的理解,而普通的 Haskell 98 可能根本不支持它们,因此固定了 arity函数更适合标准库。)

关于clojure - Clojure Core 或 Contrib 中是否有等效的 Zip 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2588227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com