我有一个“线性”类型的家庭,即形式
type family Foo a
type instance Foo T1 = T2
type instance Foo T2 = T3
...
type instance Foo T9 = T10
在我的特殊用例中,定义“反向”系列非常方便
FooRev
然后强制执行约束 (FooRev (Foo x) ~ x)
:type family FooRev a
type instance FooRev T10 = T9
type instance FooRev T9 = T8
...
type instance FooRev T2 = T1
反向家族允许 GHC 推断出许多类型,否则这些类型会由于非内射性而变得模棱两可。这与提出的想法基本相同here .该解决方案运行良好,但必须通过列出所有案例来定义“反向”类型族,这很烦人、程序化且容易出错。是否有更通用的方法来定义线性族的反向,例如
Foo
?
最佳答案
我认为 FunctionalDependencies
应该是您案例的最佳解决方案:
{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}
class Foo a b | a -> b, b -> a
instance Foo T1 T2
instance Foo T2 T3
...
现在每个
b
可以从 a
推断出反之亦然。
关于haskell - 反转类型族,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26541893/