我需要帮助解密这个clojure代码

时间:2013-04-30 09:15:44

标签: clojure

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

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

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

谢谢!

2 个答案:

答案 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)会进入结果序列。