类型族能否求值为`C a => T`这类限定类型?求实现方案
能否编写返回限定类型的类型族?
不行,你的原代码报错是因为GHC不允许类型族的等式右侧直接返回限定类型(带=>的类型)。类型族的设计目标是生成纯类型构造,而限定类型本质是约束与类型的组合,不符合类型族的返回规则。
可行解决方案
我们可以拆分逻辑:先合并约束列表,再生成函数类型,最后通过类型别名把两者结合起来,达到你想要的效果:
- 定义合并约束列表的类型族,把
[Constraint]转成单一约束:
type family Constraints (cs :: [Constraint]) :: Constraint where Constraints '[] = () Constraints (c ': cs) = (c, Constraints cs)
- 定义处理参数列表生成函数类型的类型族:
type family FunctionArgs (as :: [Type]) (r :: Type) :: Type where FunctionArgs '[] r = r FunctionArgs (a ': as) r = a -> FunctionArgs as r
- 用类型别名组合约束和函数类型:
type Function cs as r = Constraints cs => FunctionArgs as r
这样Function '[Integral a, Show b] '[String, b, a] (IO ())会展开为(Integral a, Show b) => String -> b -> a -> IO (),和你期望的Integral a => Show b => String -> b -> a -> IO ()语义完全等价——GHC会将多约束的逗号分隔形式与连续=>形式视为同一约束环境。
原代码失败的原因
GHC的类型族规则明确禁止等式右侧出现=>限定类型。类型族的返回值必须是纯Type种类的构造,而限定类型是约束与类型的绑定组合,无法作为类型族的直接输出结果。约束的应用需要放在类型别名、函数签名等更高层面处理,而非类型族内部。
内容的提问来源于stack exchange,提问作者Antal Spector-Zabusky
相关产品推荐
相关产品推荐

