如何解决函数依赖和重叠实例
{-# 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。