haskell - 反转类型族

标签 haskell type-families

我有一个“线性”类型的家庭,即形式

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/

相关文章:

haskell - 在 Haskell 中动态更新绘图

algorithm - Haskell - 如何使用列表 monad 在井字游戏中生成下一步

haskell - 为什么这个在 where 子句中使用作用域类型变量的函数不进行类型检查?

haskell - 一个类中的多个类型同义词

haskell - 从参数的约束推断类型族的约束

haskell - cabal 安装 hspec 时出错

haskell - 类型族和类型构造函数

haskell - 如何为递归单例类型定义 NFData 实例?

haskell - Haskell 中数据族的模式匹配

haskell - 如何简化这个比较符号的类型级函数?