Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Haskell中从左到右的链接方法(与从右到左相反)_Scala_Haskell_Function Composition - Fatal编程技术网

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