为什么Haskell中不能在同一表达式混用Data.Function.(&)与Control.Arrow.(>>>)
报错原因
这个错误完全来源于&和>>>两个运算符的结合性与优先级定义冲突:
&定义为infixl 1:左结合,优先级等级为1>>>定义为infixr 1:右结合,优先级等级为1
Haskell语法明确要求:优先级相同的运算符如果结合性不一致,不能在无括号的场景下连续使用,否则解析器无法确定运算的先后顺序。你写的[someList] & take 5 >>> sum刚好触发了这个规则,所以直接抛出优先级解析错误。
你用到的sum . take 5 $ [someList]没有问题,是因为.的优先级是9(远高于$的0),$为右结合,解析顺序不存在歧义。
可用的修正写法
如果想保持从左到右的管道书写习惯,可以用以下两种方式修改:
- 给函数组合段加括号,明确优先级:
[1..10] & (take 5 >>> sum)
- 直接多次用
&做链式调用,不需要额外组合运算符:
[1..10] & take 5 & sum
额外说明:你测试代码里写的[1:10]是语法笔误,正确生成1到10的整数列表写法为[1..10]。
内容的提问来源于stack exchange,提问作者Vyvianite
相关产品推荐
相关产品推荐

