You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么Haskell中不能在同一表达式混用Data.Function.(&)与Control.Arrow.(>>>)

报错原因

这个错误完全来源于&和>>>两个运算符的结合性与优先级定义冲突:

  • & 定义为 infixl 1:左结合,优先级等级为1
  • >>> 定义为 infixr 1:右结合,优先级等级为1

Haskell语法明确要求:优先级相同的运算符如果结合性不一致,不能在无括号的场景下连续使用,否则解析器无法确定运算的先后顺序。你写的[someList] & take 5 >>> sum刚好触发了这个规则,所以直接抛出优先级解析错误。

你用到的sum . take 5 $ [someList]没有问题,是因为.的优先级是9(远高于$的0),$为右结合,解析顺序不存在歧义。

可用的修正写法

如果想保持从左到右的管道书写习惯,可以用以下两种方式修改:

  1. 给函数组合段加括号,明确优先级:
[1..10] & (take 5 >>> sum)
  1. 直接多次用&做链式调用,不需要额外组合运算符:
[1..10] & take 5 & sum

额外说明:你测试代码里写的[1:10]是语法笔误,正确生成1到10的整数列表写法为[1..10]。

内容的提问来源于stack exchange,提问作者Vyvianite

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 09:06:06