首页 > 解决方案 > 函数依赖、类型族和类型同义词

问题描述

一个具有功能依赖的简单玩具类,

class C a b | a -> b, b -> a where
    f :: a -> a
    g :: b -> b

将使用类型同义词实例化一次I

type I = Int

instance C I Double where
    f = id
    g = id

并且曾经与类型同义词J

type J = Int

instance C J Float where
    f = id
    g = id

GHC 不喜欢这样,它看到了功能依赖冲突。I并且J被认为是相同的,即Int。我可以明白为什么会这样。另一方面,如果 GHC 接受了这一点,我就不会抱怨了。

毫不奇怪,类型族也会发生同样的情况。

我的结论是否正确,唯一的出路是引入包装器,如

newtype I = I Int
newtype J = J Int 

或者有没有办法避免包装展开?

标签: haskellfunctional-dependenciestype-families

解决方案


推荐阅读