Haskell 如何避开冲突的类型族实例声明

Haskell 如何避开冲突的类型族实例声明,haskell,dependent-type,category-theory,Haskell,Dependent Type,Category Theory,我试图提出爱德华·科米特的多态范畴理论。当试图翻译和现代化函子组合时,我遇到了一个问题,GHC认为类型族实例是重叠的。有没有办法解决以下问题 {-# LANGUAGE EmptyDataDecls #-} {-# LANGUAGE TypeSynonymInstances #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE Type

我试图提出爱德华·科米特的多态范畴理论。当试图翻译和现代化函子组合时,我遇到了一个问题,GHC认为类型族实例是重叠的。有没有办法解决以下问题

{-# 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个参数…
。当家庭不是注射型时,这是预期的行为。这两种人都同意。你解决了吗?