是否有Haskell $运算符的反转?

Ben*_*ino 37 haskell operators dollar-sign

一个简单的问题是,Haskell中的运算符是否与美元符号类似,但优先于左侧.IE而不是

f (x 1) 
Run Code Online (Sandbox Code Playgroud)

被写成

f $ x 1
Run Code Online (Sandbox Code Playgroud)

我想把它写成

x 1 $ f
Run Code Online (Sandbox Code Playgroud)

这纯粹是一种风格.我按顺序运行了一系列函数,如果我可以将它们写成左边写入以匹配我读到的左边写,那将会很好.如果有运营商吗?

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

Fra*_*hen 31

自GHC 7.10(base4.8.0.0)起,&位于Data.Function:https://hackage.haskell.org/package/base-4.8.0.0/docs/Data-Function.html


sas*_*nin 30

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

ghci> let (|>) = flip ($)
ghci> 3 |> (+4) |> (*6)
42
Run Code Online (Sandbox Code Playgroud)

  • 它是否保持相同的运算符优先级? (2认同)

ZyX*_*ZyX 20

我不知道,是否有一个标准的操作员,但是什么阻止你自己编写?这适用于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]
Run Code Online (Sandbox Code Playgroud)

更新:在hoogle上搜索a -> (a -> b) -> b(这是该运算符的类型)没有任何用处.

  • @Benjamin Confino:双关语总是令人愉快,但对于实际使用我建议考虑`|>`.如上所述,F#中的运算符完全符合您的要求,因此使用相同的名称可以帮助人们更轻松地理解您的代码. (5认同)
  • 看起来我会用这个,谢谢.一个£对我的运营商有吸引力. (4认同)
  • 您可以编写自己的控制流操作符,这是Haskell的真正优势之一.Haskell没有"循环"结构?没问题!写自己的. (2认同)

Jos*_*Lee 10

这个组合子在数据 - 鸟舍包中定义(舌头颊):

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

虽然实际上使用那个包是一件相当愚蠢的事情,但阅读源是有趣的,并且揭示了这个组合器是通过flip id(或者,在鸟类学的说法中cardinal idiot)的神奇咒语形成的.

  • ``caridinalIdiot``是一个华丽的组合名称! (4认同)