Function 这些函数叫什么?

Function 这些函数叫什么?,function,haskell,clojure,functional-programming,lisp,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]] 什么是foo和goo通常被称为,这样我就可以寻找现有的解决方案,而不是重新发明轮子 注:我没有试图用文字来解释,我只是展示了一些例子,希望这

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

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]]
什么是
foo
goo
通常被称为,这样我就可以寻找现有的解决方案,而不是重新发明轮子

注:我没有试图用文字来解释,我只是展示了一些例子,希望这些例子更容易获得。任意语法,便于更广泛的理解。

您可以使用:

(分区3'[a b c d e f])
=>((a b c)(d e f))
(分区2'[a b c d e f])
=>((a b)(c d)(e f))
编辑:

(应用映射列表(分区3'[AB c d e f]))
=>((a d)(b e)(c f))

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

我知道你不想要实现,但是其中一个标签是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 .. ]]
p::Int->[a]->[[a]]

p n xs=[[x |(x,y)您的
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

太好了!谢谢。那“福”呢它本身有名字吗?这是一个实现,不是名字,哈哈!我很欣赏它的用意,不过我要打勾。分区函数是一个接受谓词p并将列表拆分为p包含的元素和它不包含的元素的函数。所以它不是goo的合适名称。我不知道它有一个通用名称,但你可以称之为破环或除环。我想你要找的术语是“高阶函数”或“组合子”。在第一个示例中,
c
d
是否切换?如果输入列表的长度是输入编号的两倍以上,会发生什么情况?@DanielWagner,这是非常错误的,抱歉。
foo
相当于
zip(分区(列表,间距))
,正如mobyte所指出的,但它可能没有名称。我认为这些不是高阶函数,因为它们不以函数作为参数。Hoogle()允许您按类型搜索Haskell标准库,而不仅仅是按名称搜索。因此,如果它看起来像是一个函数,您需要的应该是“显而易见的”但是你不确定它将被调用什么,你可以找出它将具有的Haskell类型,你可以尝试Hoogle。它并不总是完美的,但它通常是有用的。即使你想用另一种语言找到这个函数,它可能至少会给你一个已知的通用名称。很好!你是如何找到它的?我想我已经读过了关于这一点,在李安的书中,它涵盖了其中的大部分:)