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

如何在Haskell中定义nonfix运算符

Haskell 实现 SML nonfix 等价效果的方法

Haskell 没有和 SML 中 nonfix 直接对应的语法。SML 里 nonfix 的作用是取消标识符的运算符固定性(优先级、结合性规则),让它变回普通前缀标识符使用;而 Haskell 中所有非字母数字构成的运算符,强制要求必须声明固定性,不存在“无固定性的运算符”,因此不需要专门的取消固定性语法。

你要实现把否定构造器绑定为短前缀别名的需求,有两种可行方案:

方案1:直接声明运算符固定性,匹配SML的前缀调用效果

不需要专门取消固定性,只要给~声明最高优先级的右结合固定性,就能把它当前缀运算符用,行为和SML中nonfix之后的~:完全一致:

data Proposition = Not_ Proposition

-- 声明运算符固定性,9是Haskell允许的最高优先级
infixr 9 ~
(~) :: Proposition -> Proposition
(~) = Not_

使用时直接写~ p就等价于Not_ p,和你预期的写法效果完全相同。

注意:~在Haskell模式匹配语境下是原生惰性匹配标记,如果你需要在模式匹配位置使用这个否定别名,会和原生语法冲突,这种场景更推荐用方案2。

方案2:使用普通标识符作为别名(Haskell惯用写法)

如果你不需要强求用运算符符号做别名,直接定义普通小写开头的前缀函数即可,这种写法不需要处理任何固定性规则,也不会和原生语法冲突,是Haskell里更通用的做法:

data Proposition = Not_ Proposition

-- 直接给构造器绑定前缀别名
neg :: Proposition -> Proposition
neg = Not_

使用时写neg p即可表示Not_ p,如果需要在模式匹配里用,也可以配合PatternSynonyms扩展定义模式别名,适配所有使用场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 11:31:11