我有一个带有fundep的类型类:
{-# 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] 具有功能依赖的重叠实例(2005 年 7 月[!])
- https://homepages.cwi.nl/~ralf/HList/
- 功能依赖的可靠和可判定类型推断
- 重叠实例 + 功能依赖 不合理?
- haskell 如何解决重叠实例?
当前 GHC Haskell 中最好的推荐解决方案是什么?