【问题标题】:Haskell functions left-to-rightHaskell 函数从左到右
【发布时间】:2012-04-04 01:27:14
【问题描述】:

我有一个经常使用的函数,它允许我以一种对我来说更自然的方式编写代码。

infixl 6 $:
($:) :: a -> (a -> b) -> b
a $: f = f a

这让我可以做类似的事情

let x = getData
        $: sort
        $: group
        $: aggregate

而不是

let x = aggregate 
        $ group 
        $ sort 
        $ getData

我最近了解到 Clojure 内置了类似的东西(我不太了解 Clojure,但我认为它会写成(-> getData sort group aggregate)?)这让我想知道 Haskell 是否也内置了它。不过,胡歌doesn't have any results

是否有包含类似内容的标准库?如果我有这样一个共同的部分是特殊的,它可能会让其他人难以阅读我的代码。

【问题讨论】:

  • 我的偏好是按照 OOHaskell 调用此操作 #,因为它与对象上的方法选择基本相同,而 # 是 OCaml 中用于此操作的运算符。或者,复制 F# 我们可以使用 |>
  • 曾有过将flip ($) 引入Data.Function 的提议,但由于无法就这样的东西是否有用(反对让初学者感到困惑等)无法达成共识而被放弃。有。这是讨论:markmail.org/message/vsplpb7aajp7goqo?q=python
  • 你能接受Yoann B.'s answer吗? & operator 现在已被广泛使用(可能主要归功于极具影响力的 lens 库,它包含在其标准编码风格中)。

标签: haskell clojure


【解决方案1】:

没有这样的内置,但Control.Category.(>>>) 很接近:它是flip (.),所以你可以写

f x = x $: sort $: group $: aggregate

作为

f = sort >>> group >>> aggregate

no shortage of definitions and names 用于您的 ($:) 组合器。我认为函数往往比简单的应用程序更适合管道风格,所以我觉得对它没有太大的需求;不过(>>>) 有点丑。

(此外,Haskell 的非严格语义意味着数据流不一定是箭头指向的方向;毕竟,aggregate 可以在sort 之前提供第一个构造函数,甚至有机会看论据。所以我倾向于只使用(.)($);我习惯了顺序。)

【讨论】:

  • 丑不丑我觉得 (>>>) 很直观,因为它看起来像 (>>=),这是一个类似的从左到右的管道。
  • 太糟糕了,它是flip (.) 而不是flip ($)。但我猜>>> 是尽可能接近。
  • hackage.haskell.org/packages/archive/diagrams-lib/0.4.0.1/doc/… 也有 (#),但它的中缀优先级与 ($) 大不相同。
【解决方案2】:

您所描述的反向应用程序运算符现在是标准包 base(自 4.8.0 起)的一部分,即 & operator

请注意,此运算符的定义优先级低于您建议的运算符 (infixl 1)。

【讨论】:

    【解决方案3】:

    在 Hackage 中有一个名为 Flow (https://hackage.haskell.org/package/flow-1.0.10/docs/Flow.html) 的库,由 Taylor Fausak 为这一确切需求而创建。

    它使用|> 运算符(受 F# 启发)充当最后一个线程。

    例如:

    3 |> succ |> recip |> negate
    -0.25
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-04
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 2022-01-18
      • 2022-01-13
      • 2017-07-22
      • 2016-05-02
      相关资源
      最近更新 更多