Haskell 如何避开冲突的类型族实例声明
我试图提出爱德华·科米特的多态范畴理论。当试图翻译和现代化函子组合时,我遇到了一个问题,GHC认为类型族实例是重叠的。有没有办法解决以下问题Haskell 如何避开冲突的类型族实例声明,haskell,dependent-type,category-theory,Haskell,Dependent Type,Category Theory,我试图提出爱德华·科米特的多态范畴理论。当试图翻译和现代化函子组合时,我遇到了一个问题,GHC认为类型族实例是重叠的。有没有办法解决以下问题 {-# LANGUAGE EmptyDataDecls #-} {-# LANGUAGE TypeSynonymInstances #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE Type
{-# LANGUAGE EmptyDataDecls #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeInType #-}
module Hask.Functor.Compose where
import qualified Prelude as Base
import Data.Kind (Type)
-- The Type of Categories
type Cat i = i -> i -> Type
-- Natural Transformations
data Nat (p :: Cat i) (q :: Cat j) (f :: i -> j) (g :: i -> j) :: Type where
-- Hail Satan
data family Any :: k
data COMPOSE = Compose
type Compose = (Any 'Compose :: Cat i -> Cat j -> Cat k -> (j -> k) -> (i -> j) -> (i -> k))
-- Simplified Functor
class Functor (f :: i -> j) where
type Dom f :: Cat i
instance Functor (Compose p q r f g) where
type Dom (Compose p q r f g) = p
instance Functor (Compose p q r f) where
type Dom (Compose p q r f) = Nat p q
错误与:
Preprocessing library for kpf-0.1.0..
Building library for kpf-0.1.0..
[6 of 6] Compiling Hask.Functor.Compose ( Hask/Functor/Compose.hs, dist/build/Hask/Functor/Compose.o )
Hask/Functor/Compose.hs:30:8: error:
Conflicting family instance declarations:
forall j1 i j2 (p :: Cat i) (q :: Cat j1) (r :: Cat j2) (f :: j1
-> j2) (g :: i -> j1).
Dom (Compose p q r f g) = p
-- Defined at Hask/Functor/Compose.hs:30:8
forall j i k (p :: Cat i) (q :: Cat j) (r :: Cat k) (f :: j -> k).
Dom (Compose p q r f) = Nat p q
-- Defined at Hask/Functor/Compose.hs:33:8
|
30 | type Dom (Compose p q r f g) = p
| ^^^
可以找到完整的未简化代码。我觉得这似乎是一个GHC错误。
Dom
的两个实例具有不同的类型,因此它们不应该重叠。您可以通过将Dom
的kind变量设置为显式类型参数来绕过它?是的,这确实会损害此库的可用性。我想我可能会打开一个GHC trac错误,然后尝试修复它。我不同意这是一个真正的错误-如果你把它转换成顶级类型族声明,它会编译得很好,问题是种类评估只会给出族中列出的第一个表单的预期结果,即如果4参数表单是第一个,:种类!Dom(组合…4个参数…)=第一个参数,但:种类!Dom(合并…5个参数…)=Dom(合并…5个参数…
。当家庭不是注射型时,这是预期的行为。这两种人都同意。你解决了吗?