在Haskell中从左到右链接方法(而不是从右到左)

ssc*_*zio 9 haskell scala function-composition

我来自斯卡拉.所以我经常这样做:

println((1 to 10).filter(_ < 3).map(x => x*x))
Run Code Online (Sandbox Code Playgroud)

在Haskell中,在我发现我可以使用$和删除所有嵌套的括号之后.,我最近发现自己写了:

putStrLn . show . map (**2) . filter (< 3) $ [1..10] 
Run Code Online (Sandbox Code Playgroud)

现在,这有效,但代码从右向左阅读,除非我转向阿拉伯语,否则我很难理解.

有没有其他技巧让我从左到右连接功能?或者这只是Haskell惯用的方式?

oba*_*adz 16

不幸的是,这是Haskell惯用的方式.但是&运营商可能会做你想做的事.

import Data.Function ((&))

[1..10] & filter (< 3) & map (**2) & show & putStrLn
Run Code Online (Sandbox Code Playgroud)

基本上,(&) = flip ($).同样,Control.Arrow.(>>>) = flip (.)

更新(6个月以上):我不得不承认,这个问题对我来说是一个很大的挫折感,我一直在玩这个潜在的解决方案:

https://gist.github.com/obadz/9f322df8ba6c8a9767683d2f86af8589#file-directionalops-hs-L81

  • 太糟糕了`x&f >>> g`由于错误的优先级而失败...它会与`g紧密匹配.f $ x`. (2认同)

Ber*_*rgi 5

是的,这是惯用的Haskell.不是阿拉伯语,而是数学,源于作文的语法.另请参见Haskell组合(.)与F#的管道前向运算符(|>).

尽管如此,即使在Haskell中,您有时更喜欢在另一个方向上编写调用,并且您会找到一些Data.Function已定义的库(例如,自4.8.0以来)

(&) = flip ($)
Run Code Online (Sandbox Code Playgroud)

这样你就可以表达你的电话

[1..10] & filter (< 3) & map (**2) & show & putStrLn
Run Code Online (Sandbox Code Playgroud)