这些功能函数叫什么?

时间:2013-03-30 04:14:38

标签: function haskell clojure functional-programming lisp

我正在寻找一种实现这个功能的方法:

list = [a b c d e f]
foo(list, 3) = [[a d] [b e] [c f]]

可能的解决方案是:

foo(list,spacing) = zip(goo(list,spacing))

例如,

goo([a b c d e f],3) = [[a b c] [d e f]]

foogoo通常被称为什么,所以我可以寻找现有的解决方案,而不是重新发明轮子?

注意:我没有尝试用文字解释,而是展示了希望更容易获得的例子。任意语法,以便更广泛地理解。

3 个答案:

答案 0 :(得分:3)

您可以使用partition

(partition 3 '[a b c d e f])
=> ((a b c) (d e f))

(partition 2 '[a b c d e f])
=> ((a b) (c d) (e f))

修改

(apply map list (partition 3 '[a b c d e f]))
=> ((a d) (b e) (c f))

答案 1 :(得分:1)

我认为没有内置功能。这很容易实现。

我知道你不想要实现,但其中一个标签是Haskell所以也许你想看到这个

 p :: Int -> [a] -> [[a]]
 p n xs = [  [x | (x ,y) <- ys , y `mod` n == i]  |  i <- [0 .. n - 1] ,  let ys = zip xs [0 .. ]]

这很有用。

答案 2 :(得分:1)

您的goo函数为drop,带有翻转参数。鉴于此,您可以像在问题中所说的那样实施foo

let foo list spacing = zip list (drop spacing list)

这仍然不能完全给出你需要的结果,但是关闭:

Prelude> foo "abcdef" 3
[('a','d'),('b','e'),('c','f')]

编辑:

仔细阅读,goo函数为splitAt,并带有翻转参数。鉴于此,foo可以这样定义:

let foo list spacing = (uncurry zip) $ splitAt spacing list

与以下内容相同:

let foo list spacing = let (left, right) = splitAt spacing list
                       in zip left right