(map drop '(0 1) '((0 1 2 3) (1 2 3)))
答案是:((0 1 2 3) (2 3))
有人可以解释发生了什么吗?我无法破译这段代码?!
谢谢!
(map drop '(0 1) '((0 1 2 3) (1 2 3)))
答案是:((0 1 2 3) (2 3))
有人可以解释发生了什么吗?我无法破译这段代码?!
谢谢!
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 参数。
请注意,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)
进入结果序列。