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

Haskell能否为多参数类型类定义自定义中缀运算符

完全可以实现你预期的中缀类型类写法

Haskell原生支持将多参数类型类声明为自定义中缀运算符形式,不需要额外做语法包装,只需要开启对应语言扩展即可正常使用。

必须开启的语言扩展

  • MultiParamTypeClasses:定义双参数及以上类型类的基础依赖,没有该扩展无法声明多参数类型类
  • TypeOperators:核心功能扩展,支持将运算符形式的标识符用作类型层面的构造器、类型类名,直接实现你想要的a ? b形式的类定义与约束写法

可直接运行的代码示例

-- 代码顶部开启所需扩展
{-# LANGUAGE TypeOperators, MultiParamTypeClasses #-}

-- 声明中缀运算符的结合性与优先级,规则和值层面的运算符完全一致
infixr 1 ?

-- 直接以中缀形式定义类型类,替代原有`MyClass a b`的常规写法
class a ? b where
  myMethod :: a -> b

-- 约束位置直接使用中缀形式,和预期写法完全一致
foo :: a ? b => a -> b
foo = myMethod

使用注意事项

  • 中缀形式和前缀括号形式完全等价:在类定义、约束声明、实例声明的位置,既可以写中缀的Int ? String,也可以写带括号的前缀形式(?) Int String,两种写法的解析结果没有任何区别
  • 原有类型类的所有特性都不受影响:带父类约束、关联类型、默认实现的多参数类,都可以直接套用中缀形式,比如class (Show a, Eq b) => a ? b where ...这类写法完全兼容
  • 优先级声明全局生效:一旦定义了infixr 1 ?,所有用到这个中缀类型类的位置都会自动遵循对应的优先级规则,避免不同运算符混用时的语法歧义

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 22:06:03