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

Haskell操作符使用疑问:自定义foldList函数改写法后无法编译?

关于Haskell中操作符与函数调用的疑问解答

嘿,刚学Haskell遇到这个问题太正常了!我来给你把这里的门道说清楚:

核心问题:操作符的“身份”看名字形式,不是功能

在Haskell里,只有名称由纯符号组成的东西(比如+、*、++),才能直接用a op b这种中缀写法。而你代码里的op是一个普通的变量名(哪怕它绑定的是一个操作符函数),在函数内部它只是个“普通函数变量”,默认没有操作符的身份。

为什么修改后的代码编译失败?

你原来的代码里(op) x (foldList op t)能运行,是因为括号把op当成了普通函数来调用——不管op实际传入的是+还是别的二元函数,这种前缀写法都是合法的。

但改成x op (foldList op t)时,Haskell会默认要求中间的op是一个原生操作符(符号名),而op是字母组成的变量名,不符合这个要求,所以编译器直接报错了。

想让普通函数变量用中缀写法?用反引号就行!

如果你就想用a op b这种中缀风格,只需要给op套上反引号(`),像这样:

| otherwise = x `op` (foldList op t)

这样Haskell就会把op临时当作中缀操作符处理,和前缀写法op x (foldList op t)完全等价。

反过来,如果你想把原生操作符当普通函数用,就给它套括号,比如(+) 1 2和1 + 2是一样的——这也是你原来代码里(op)写法有效的原因。

补两个实用小规则

  1. 自定义函数如果想默认作为操作符使用,可以在定义时声明优先级和结合性,比如:
    infixl 6 `myAdd`
    myAdd :: Double -> Double -> Double
    myAdd a b = a + b
    
    这样就能直接写3 myAdd 5,可读性会好很多。
  2. 普通函数调用是左结合且优先级最高的,而操作符的优先级和结合性可以自定义,这也是两者的重要区别。

内容的提问来源于stack exchange,提问作者P-A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:12:17