【问题标题】:What are those functional functions called?这些功能函数叫什么?
【发布时间】:2013-03-20 20:13:13
【问题描述】:

我正在寻找一种实用的方法来实现它:

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 通常叫什么,所以我可以寻找现有的解决方案而不是重新发明轮子?

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

【问题讨论】:

  • 我认为您正在寻找的术语是“高阶函数”或“组合子”。
  • 在您的第一个示例中是否切换了 cd?如果输入列表的长度是输入数字的两倍以上怎么办?
  • @DanielWagner 这是非常错误的,抱歉。 foo 相当于 zip(partition(list,spacing)),正如 mobyte 所指出的,但它可能没有名字。
  • 我不认为这些是高阶函数,因为它们不将函数作为参数。
  • Hoogle (haskell.org/hoogle) 允许您通过 type 搜索 Haskell 标准库,而不仅仅是名称。因此,如果您想要的功能看起来应该是“显而易见的”,但您不确定它会被调用什么,并且您可以弄清楚它应该具有的 Haskell 类型,您可以尝试 Hoogle。它并不总是完美的,但它通常会有所帮助。即使您想查找其他语言的函数,它至少可以为您提供一个通用名称。

标签: function haskell clojure functional-programming lisp


【解决方案1】:

你可以使用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))

【讨论】:

  • 太棒了!谢谢你。 “foo”本身呢,它有名字吗?
  • 这是一个实现,不是名字,哈哈!不过,我很感激你的好意,打勾。
  • 分区函数是这样一种函数,它接受一个谓词 p 并将一个列表拆分为 p 持有的元素和它不持有的元素。所以这不是 goo 的合适名称。我不知道它的通用名称,但你可以称之为 break 或 divide。
【解决方案2】:

我认为没有内置函数。它很容易实现。

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

这很实用。

【讨论】:

    【解决方案3】:

    您的 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
    

    【讨论】:

    • 不错!你是怎么找到的?
    • 我想我已经在 LYAH 书中读到过它。无论如何,它涵盖了大多数:)
    猜你喜欢
    • 1970-01-01
    • 2018-12-19
    • 2010-10-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    相关资源
    最近更新 更多