【问题标题】:Is there an inverse of the Haskell $ operator?Haskell $ 运算符是否有逆运算?
【发布时间】:2011-05-04 15:51:05
【问题描述】:

一个简单的问题,Haskell 中是否有一个像美元符号一样工作但优先于左侧的运算符。 IE。而不是

f (x 1) 

写成

f $ x 1

我想写成

x 1 $ f

这纯粹是一种风格上的东西。我正在按顺序运行一系列函数,如果我可以从左到右编写它们以匹配我从左到右阅读的内容,那就太好了。如果有这方面的运营商?

[更新] 有几个人问我是否不能定义我自己的。作为回答,我想在重新发明轮子之前检查是否有现有的操作员。

【问题讨论】:

  • 这就像 F# 的管道组合运算符。相关讨论(关于为什么它没有内置到 Haskell 中):stackoverflow.com/questions/1457140/…
  • 看来我的问题的答案是“否”。谢谢你:)
  • 你意识到你在同一个表达式中结合了从左到右和从右到左的应用程序,不是吗?我想大多数人都会对此犹豫不决。反向应用就是所谓的T-combinator。几年前经常用(#)表示,但现在#在GHC中是一个特殊符号,所以不再多用了。
  • 你想要:f (g 1)。为什么不只是 f 。 g $ 1?
  • @demi 我相信 OP 正在寻求在从左到右的管道中表达 f (g 1)。 f . g $ 1 正好相反

标签: haskell operators dollar-sign


【解决方案1】:

从 GHC 7.10 (base 4.8.0.0) 开始,& 位于 Data.Function: https://hackage.haskell.org/package/base-4.8.0.0/docs/Data-Function.html

【讨论】:

    【解决方案2】:

    在 Haskell 中,您可以使用 flip 更改任何二元函数或运算符的参数顺序:

    ghci> let (|>) = flip ($)
    ghci> 3 |> (+4) |> (*6)
    42
    

    【讨论】:

    • 是否保持相同的运算符优先级?
    【解决方案3】:

    我不知道是否有标准运算符,但是是什么阻止您编写自己的运算符?这适用于 ghci:

    Prelude> let a $> b = b a
    Prelude> 1 $> (+2)
    3
    Prelude> sum [1, 2] $> (+2)
    5
    Prelude> map (+2) [1, 2] $> map (+3)
    [6,7]
    

    更新:在hoogle 上搜索a -> (a -> b) -> b(它是该运算符的类型)没有发现任何有用的信息。

    【讨论】:

    • 看来我会用这个,谢谢。运算符对我有吸引力。
    • @Benjamin Confino:双关语总是很有趣,但对于实际使用,我建议考虑|>。如上所述,F# 中的该运算符完全符合您的要求,因此使用相同的名称将有助于人们更轻松地理解您的代码。
    • Haskell 的真正优势之一是您可以编写自己的控制流操作符。 Haskell 没有“循环”结构?没问题!自己写吧。
    • |> 由 Data.Sequence 使用。 # 听起来是个好主意。
    • 链接:Hoogle search for a -> (a -> b) -> b。具有该确切类型的唯一结果是 ($)($!)
    【解决方案4】:

    这个组合器是在data-aviary 包中定义的(舌尖上的):

    Prelude Data.Aviary.BirdsInter> 1 `thrush` (+2)
    Loading package data-aviary-0.2.3 ... linking ... done.
    3
    

    虽然实际使用该软件包是一件相当愚蠢的事情,但阅读源代码很有趣,并揭示了 this combinator 是通过 flip id 的魔法咒语形成的(或者,用鸟类学的说法,cardinal idiot)。

    【讨论】:

    • caridinalIdiot 是一个伟大的组合名称!
    【解决方案5】:

    我不知道有任何标准版本,但我在几个地方看到 (#) 用于此目的。特别想到的是 HOC,它以如下成语使用它:

    someObject # someMessage param1 param2
    

    我似乎记得看到其他“面向对象”库以相同的方式使用 # 运算符,但不记得有多少或哪些。

    【讨论】:

    • 洗涤用途 (#)。 Erik Meijer、Daan Leijen 和 James Hook 使用它来编写带有 Active Haskell(Haskell-COM 桥)的 MS Agent 脚本。可能最初的 Haskell / ObjectiveC 桥也使用了 (#)。
    【解决方案6】:

    你不能重新定义$

    let ($) x f = f x
    

    或者只是选择不同的运算符,例如$$

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-21
      • 2022-07-13
      • 1970-01-01
      • 2011-11-28
      • 2011-04-12
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多