4
(map drop '(0 1) '((0 1 2 3) (1 2 3)))

答案是:((0 1 2 3) (2 3))

有人可以解释发生了什么吗?我无法破译这段代码?!

谢谢!

4

2 回答 2

9

Clojuremap可以在函数操作数之后使用多个 seq,并为每个 seq 压缩一个元素。当第一个 seq 用完时,映射结束。

在您的表格中,您给出map了两个 seqs:'(0 1)并且'((0 1 2 3) (1 2 3))它们都有两个元素。因此,代码描述了两个drop调用:

(drop 0 '(0 1 2 3)) ; => '(0 1 2 3)
(drop 1 '(1 2 3))   ; => '(2 3)

希望这个文档有助于解决这个问题(强调我的):

clojure.core/map ([f coll] [f c1 c2] [f c1 c2 c3] [f c1 c2 c3 & colls])

返回一个惰性序列,该序列由将 f 应用于每个 coll 的第一项集合的结果组成,然后将 f 应用于每个 coll 中的第二项集合,直到用完任何一个 coll。其他 colls 中的任何剩余项目都将被忽略。函数
f 应该接受 number-of-colls 参数。

于 2013-04-30T09:21:25.820 回答
2

请注意,Clojuremap是一个非常灵活的函数,因为它可以在您需要其他语言的不同函数的情况下做几件事情。

例如,它完成了这三个 Haskell 函数可以做的所有事情:

map :: (a -> b) -> [a] -> [b]
zip :: [a] -> [b] -> [(a, b)]
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]

在哪里

zip = zipWith (,)

所以在clojure中你map用来做两件不同的事情:

a) 将序列元素转换为相同长度的序列。这就是 Haskell 和其他语言中所谓的“地图”。

b) 将两个或多个序列按元素压缩在一起,得到一个与最短输入序列一样长的序列。这在 Haskell 中称为“zipWith”。

提供的函数必须接受与输入序列一样多的参数,并返回应进入输出序列的元素。

您提供的代码map在其第二个功能中使用。0它从(0 1 2 3)和中删除1元素(1 2 3)。结果,它们是(0 1 2 3)(2 3)进入结果序列。

于 2013-04-30T12:33:21.460 回答