如何在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
相关产品推荐
相关产品推荐

