【问题标题】:Is Haskell's dollar $ operator, and F#'s backwards-pipe <| the same idea?是 Haskell 的美元 $ 运算符,和 F# 的向后管道 <|同样的想法?
【发布时间】:2020-04-18 00:15:52
【问题描述】:

我用 F# 已经好几年了, 现在我正在尝试学习一点Haskell, 并找出我可以转移哪些想法。

【问题讨论】:

  • 我不知道 F#,但是刚刚搜索它并找到了 this,看来它确实是相同的,并且在避免括号方面具有相似的主要用途。 (我注意到 Elm 也有正向和反向管道运算符,在那种语言中,我可以确认 &lt;| 运算符与 Haskell 的 $ 相同。)
  • 这是相同的想法,但 IIRC 我认为 Haskell ´$` 的优先级较低,并且具有正确的关联性,可以混合正向和反向管道。在 F# 中,因为 |&gt;&lt;| 具有相同的并且都是左关联的,所以我认为 &lt;| 不太有用。也因为 F# 中的类型推断通常从我读过的左上角流到右下角,所以习惯用法是更喜欢正向管道。话虽如此,我有时确实使用&lt;|
  • 为什么不回答这个问题?

标签: haskell f#


【解决方案1】:

Haskell 允许您定义自定义运算符。 F# |> 操作符可以这样定义:

(|>) :: a -> (a -> b) -> b
a |> f = f a

F#

(<|) :: (a -> b) -> a -> b
f <| a = f a

和 F# >>

(>>) :: (a -> b) -> (b -> c) -> (a -> c)
f >> g = (.) g f

【讨论】:

    【解决方案2】:

    是的——它们是等价的。我不知道 F#,但在 Haskell 中,这个运算符经常用于简化带括号的长表达式:$ 的优先级低于任何其他运算符,例如f x + y 被解释为(f x) + y,但f $ x + y 被解释为f (x + y)。类似地,f (g (h x)) 的长链可以写成f $ g $ h x

    查看list of F# operators,这里还有一些可以帮助您的信件:

    • F# f &lt;&lt; g ↔ Haskell f . g
    • F# :: ↔ Haskell :,而 F# : ↔ Haskell ::
    • F# &lt;&gt; ↔ Haskell /=
    • F# |&gt;&gt;&gt;Prelude 中没有任何对应的运算符——我希望他们有!但您可以根据需要使用Data.Function.&amp;Control.Category.&gt;&gt;&gt; 替换它们。
    • (如果我发现任何内容,我会添加更多内容;如果有人要添加到此列表中,请随时发表评论!)

    【讨论】:

    • Haskell 得到了 :/:: 的倒退与其他一切相比。哦,好吧。
    猜你喜欢
    • 2010-11-30
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2017-06-03
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    相关资源
    最近更新 更多