问题描述
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE FlexibleInstances #-}
class C a b | a -> b
我想提供具体实例:
instance C A B
以及一般的默认实例:
instance C a D
按照编写的方式实现此代码,将无法编译:
Functional dependencies conflict between instance declarations:
instance C A B
instance C a D
切换到字体系列无济于事:
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
class C a where
type C' a
instance C A where
type C' A = B
instance C a where
type C' a = D
Conflicting family instance declarations:
C' A = B
C' a = D
理想情况下,我想让 GHC 使用 OverlappingInstances 的“最具体”规则来解决这个问题。
我知道这是一个已经存在一段时间的问题,并提出了各种hacky解决方案:
- [Haskell-cafe] Overlapping Instances with Functional Dependencies (July 2005[!])
- https://homepages.cwi.nl/~ralf/HList/
- Sound and Decidable Type Inference for Functional Dependencies
- Overlapping Instances + Functional Dependencies Unsound?
- How does haskell resolve overlapping instances?
当前 GHC Haskell 中最好的推荐解决方案是什么?
解决方法
最好的解决方案是封闭类型系列:
type family C' a where
C' A = B
C' a = D