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。它并不总是完美的,但它通常是有用的。即使你想用另一种语言找到这个函数,它可能至少会给你一个已知的通用名称。很好!你是如何找到它的?我想我已经读过了关于这一点,在李安的书中,它涵盖了其中的大部分:)