(map drop '(0 1) '((0 1 2 3) (1 2 3)))
答案是:((0 1 2 3)(2 3))
有人可以解释一下发生了什么吗?我无法破译此代码?!
谢谢!
答案 0 :(得分:9)
Clojure map
可以在函数操作数之后获取多个seq,并为每个seq拉出一个元素。当第一个seq用尽时,地图结束。
在表单中,您提供map
两个seq:'(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中的第二项的集合,直到任何一个colls为止 累。其他colls中的任何剩余项都将被忽略。功能
f应该接受colls of colls参数。
答案 1 :(得分:2)
请注意,Clojure的map
是一个非常灵活的功能,因为它可以做一些你需要其他语言不同功能的东西。
例如,它完成了这三个Haskell函数的所有功能:
map :: (a -> b) -> [a] -> [b]
zip :: [a] -> [b] -> [(a, b)]
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
其中
zip = zipWith (,)
所以在clojure中你使用map
做两件事:
a)将序列元素转换为相同长度的序列。这就是Haskell和其他语言中所谓的“map”。
b)将两个或多个序列一起压缩成一个元素,给出与最短输入序列一样长的序列。这在Haskell中称为“zipWith”。提供的函数必须接受与输入序列一样多的参数,并返回将进入输出序列的元素。
您提供的代码在其第二个函数中使用map
。它从0
中删除(0 1 2 3)
和1
元素中的(1 2 3)
个元素。结果(0 1 2 3)
和(2 3)
会进入结果序列。