Scala Haskell中从左到右的链接方法(与从右到左相反)
我来自斯卡拉。所以我经常做这样的事情:Scala Haskell中从左到右的链接方法(与从右到左相反),scala,haskell,function-composition,Scala,Haskell,Function Composition,我来自斯卡拉。所以我经常做这样的事情: println((1 to 10).filter(_ < 3).map(x => x*x)) 现在,这是可行的,但是代码是从右向左读的,除非我换成阿拉伯语,否则我很难解释 有没有其他技巧可以让我从左到右链接函数?或者这只是Haskell惯用的方式?为什么不创建一个新操作符 (#) :: a -> (a -> b) -> b (#) = flip id 现在你可以写了 [1..10]#过滤器(>)=flip(.) 更新(6个
println((1 to 10).filter(_ < 3).map(x => x*x))
现在,这是可行的,但是代码是从右向左读的,除非我换成阿拉伯语,否则我很难解释
有没有其他技巧可以让我从左到右链接函数?或者这只是Haskell惯用的方式?为什么不创建一个新操作符
(#) :: a -> (a -> b) -> b
(#) = flip id
现在你可以写了
[1..10]#过滤器(<3)#映射(**2)#显示#putStrLn
这相当于
Data.Function
中的(&)
运算符。不幸的是,这是Haskell惯用的方式。但是&
操作符可能会执行您想要的操作
import Data.Function ((&))
[1..10] & filter (< 3) & map (**2) & show & putStrLn
import Data.Function((&))
[1..10]&过滤器(<3)&地图(**2)&显示和显示
本质上,(&)=翻转($)
。同样地,Control.Arrow.(>>>)=flip(.)
更新(6个多月后):我必须承认,这个问题对我来说是一个很大的挫折源,我一直在考虑这个潜在的解决方案:
是的,这是惯用的哈斯克尔语。不是阿拉伯语,而是数学,源自作文的语法。另见 尽管如此,即使在Haskell中,您有时也更喜欢以另一个方向编写调用,并且您会发现一些库(例如自base 4.8.0以来)已经定义了
(&) = flip ($)
这样你就可以把你的电话表达成
[1..10] & filter (< 3) & map (**2) & show & putStrLn
[1..10]&过滤器(<3)和映射(**2)&显示和计算
我个人唯一一次错过了从左到右的链接操作符是however注意到putStrLn。显示=打印
。另外,你可以使用mapM
或forM
:forM[x | x一旦你习惯了,从左到右更容易推理:它给出了表达式的类型。在你的例子中,putStrnLn…
我知道这是一个IO。无用的观察:普通链式函数应用程序的“流”(不使用函数组合)是从右到左:f.g.h$x=f(g(h(x))
。这是一个非常古老的约定(甚至在类似C的语法中也适用,所以它不仅仅是Haskellism)。点方法语法是“向后”的注意,不是函数组合运算符。注意,在Scala示例中,“流”更难跟踪;它实际上是在<代码>(1到10)中间开始的。
,然后向右移动,然后突然跳回到左边的println
。太糟糕了x&f>>g
由于优先级错误而失败…它将与g.f$x
紧密匹配。
[1..10] & filter (< 3) & map (**2) & show & putStrLn