【问题标题】:Finding haskell higher-order functions寻找haskell高阶函数
【发布时间】:2012-10-15 00:03:12
【问题描述】:

将列表压缩到自身上的函数可以定义为:

let adjacent1 l = zip l $ tail l

这可行,但我想以无点风格定义它。为此,我定义了一个函数dollarize

let dollarize f1 f2 x = f1 x $ f2 x
let adjacent1 = dollarize zip tail

这可行,但显然我宁愿不定义自己的高阶函数。有没有办法找到dollarize 的标准等价物,假设它存在?如果没有,这种组合功能的功能在哪里?

【问题讨论】:

    标签: haskell functional-programming function-composition pointfree


    【解决方案1】:

    pointfree 工具可以自动为您执行此操作。

    $ pointfree "\l -> zip l (tail l)"
    ap zip tail
    $ pointfree "\f1 f2 x -> f1 x $ f2 x"
    ap
    

    【讨论】:

    • 如果你是一个普通的 IRC 用户,#haskelllambdabot 可以做同样的事情。只需查询@pl \l -> zip l (tail l),您将得到相同的答案。
    【解决方案2】:

    使用Applicative(->) a 实例怎么样?

    Prelude Control.Applicative> :t zip <*> tail
    zip  <*> tail :: [a] -> [(a, a)]
    Prelude Control.Applicative> zip <*> tail $ [1 .. 4]
    [(1,2),(2,3),(3,4)]
    

    又短又甜。

    【讨论】:

    • 是的,刚刚检查过,不确定。
    • 如果您还记得&lt;$&gt; on functions 只是函数组合,那么很明显,与id 组合显然没有任何作用。另外值得一提的是,&lt;*&gt; 是 SKI 微积分中的 S 组合子。
    • 如果我知道 SKI 微积分会有帮助 ;)
    • 是的,这是我想做的事情,但是如果我不知道,我怎么找到&lt;*&gt;
    • @Marcin:通常情况下,我推荐Hoogle。但是,在这种情况下它不会找到答案,因为它特别对待函数箭头 (-&gt;),所以它永远不会找到依赖于使用 (a -&gt;) 作为 monad/applicative 的函数,所以搜索 f (b -&gt; c) -&gt; f b -&gt; f c 有效,但不是(a -&gt; b -&gt; c) -&gt; (a -&gt; b) -&gt; a -&gt; c
    【解决方案3】:

    根据@Daniel Fischer 的回答。您也可以使用 (-&gt;) a 的 monad 实例:

    Prelude Control.Monad.Instances> let adjacent1 = tail >>= flip zip
    Prelude Control.Monad.Instances> adjacent1 [1..4]
    [(1,2),(2,3),(3,4)]
    

    【讨论】:

      猜你喜欢
      • 2017-04-21
      • 1970-01-01
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多