Haskell从左到右运行

Xod*_*rap 18 haskell clojure

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

infixl 6 $:
($:) :: a -> (a -> b) -> b
a $: f = f a
Run Code Online (Sandbox Code Playgroud)

这让我做了类似的事情

let x = getData
        $: sort
        $: group
        $: aggregate
Run Code Online (Sandbox Code Playgroud)

代替

let x = aggregate 
        $ group 
        $ sort 
        $ getData
Run Code Online (Sandbox Code Playgroud)

我最近了解到Clojure内置了类似的内容(我不太了解Clojure,但我认为它会被写入(-> getData sort group aggregate)?)这让我想知道Haskell是否也内置了它.但Hoogle 没有任何结果.

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

ehi*_*ird 22

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

f x = x $: sort $: group $: aggregate
Run Code Online (Sandbox Code Playgroud)

f = sort >>> group >>> aggregate
Run Code Online (Sandbox Code Playgroud)

没有的定义和名称短缺为您的($:)组合子.我认为函数往往比简单的应用程序更适合管道样式,所以我觉得它没有什么需要; (>>>)但是有点难看.

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

  • 丑陋与否我认为(>>>)是直观的,因为它看起来像(>> =),这是一个类似的从左到右的管道. (2认同)

Yoa*_* B. 5

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

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