首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GHC不能推断实例的存在,尽管在量化的约束中被提到

GHC不能推断实例的存在,尽管在量化的约束中被提到
EN

Stack Overflow用户
提问于 2019-06-26 19:08:55
回答 2查看 128关注 0票数 2

我有以下程序:

代码语言:javascript
复制
{-# language MultiParamTypeClasses #-}
{-# language PolyKinds #-}
{-# language QuantifiedConstraints #-}
{-# language RankNTypes #-}
{-# language ScopedTypeVariables #-}
{-# language TypeApplications #-}
{-# language UndecidableInstances #-}

module Control.IO.GWeave where

import Generics.Kind


newtype HigherOrder e m a =
  HigherOrder ( e m a )


weaveFromTo
  :: forall m n e a code.
     ( GenericK e ( LoT2 n a )
     , GenericK e ( LoT2 m a )
     , GWeave ( RepK e ) m n ( LoT2 m a ) ( LoT2 n a )
     )
  => ( forall x. m x -> n x ) -> HigherOrder e m a -> HigherOrder e n a
weaveFromTo eta ( HigherOrder a ) =
    HigherOrder ( toK ( gweave @_ @m @n @( LoT2 m a ) @( LoT2 n a ) eta ( fromK a ) ) )

class GWeave f ( m :: * -> * ) ( n :: * -> * ) as bs where
  gweave :: ( forall x. m x -> n x ) -> f as -> f bs

class Effect e where
  weave :: ( forall x. m x -> n x ) -> e m a -> e n a

instance
  ( forall n a. GenericK e ( LoT2 n a )
  , forall m n a. GWeave ( RepK e ) m n ( LoT2 m a ) ( LoT2 n a )
  ) => Effect ( HigherOrder e ) where
  weave eta =
    weaveFromTo eta

在这里,我有class Effect e where weave = ...。我想使用DerivingVia为任何数据类型提供Effect的实例,这些数据类型是GenericK的实例(来自Hackage上的kind-generics库)。这是完全可行的,weaveFromTo是大部分工作。最后一步就是简单地说instance Effect (HigherOrder e) where weave f = weaveFromTo f。然而,GHC似乎拒绝接受这一点,即使我在Effect (HigherOrder e)的实例声明中添加了必要的约束

代码语言:javascript
复制
• Could not deduce (GWeave (RepK e) m n (LoT2 m a) (LoT2 n a))
  from the context: (forall (n :: * -> *) (a :: k).
                     GenericK e (LoT2 n a),
                     forall (m :: * -> *) (n :: * -> *) (a :: k).
                     GWeave (RepK e) m n (LoT2 m a) (LoT2 n a))
    bound by an instance declaration:
               forall k (e :: (* -> *) -> k -> *).
               (forall (n :: * -> *) (a :: k). GenericK e (LoT2 n a),
                forall (m :: * -> *) (n :: * -> *) (a :: k).
                GWeave (RepK e) m n (LoT2 m a) (LoT2 n a)) =>
               Effect (HigherOrder e)

我不明白为什么GHC不高兴。任何人都能看到问题所在吗?如果您安装了kind-generics,上面的代码应该可以工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-27 02:34:42

您不需要使用newtype,只需将类型族应用程序RepK e移到量化之外即可工作(更改位于标记为(!)的行中):

代码语言:javascript
复制
instance
  ( forall n a. GenericK e ( LoT2 n a )
  , r ~ ( RepK e )  -- (!)
  , forall m n a. GWeave r m n ( LoT2 m a ) ( LoT2 n a )
  ) => Effect ( HigherOrder e ) where
  weave eta =
    weaveFromTo eta

这是因为,根据设计,Haskell中的实例不能使用类型族。也就是说,您不能编写如下的实例:

代码语言:javascript
复制
instance Eq (RepK e) where ...

量化的约束继承了这个限制,因为它们引入了某种“局部实例”。您可以在GHC tracker和此Reddit thread中找到更多信息。

作为额外的建议,每次在kind-generics中使用RepK e时,总是在任何量化之外给它一个明确的名称。否则,你最终会得到像你得到的那样奇怪的错误。

票数 5
EN

Stack Overflow用户

发布于 2019-06-26 19:24:17

好了,我找到了解决方案--我必须将RepK打包成一个新类型:

代码语言:javascript
复制
weaveFromTo
  :: forall m n e a code.
     ( GenericK e ( n :&&: a :&&: LoT0 )
     , GenericK e ( m :&&: a :&&: LoT0 )
     , GWeave ( WrappedRepK e ) m n ( LoT2 m a ) ( LoT2 n a )
     )
  => ( forall x. m x -> n x ) -> HigherOrder e m a -> HigherOrder e n a
weaveFromTo eta ( HigherOrder a ) =
    HigherOrder ( toK ( unWrapRepK ( gweave @_ @m @n @( LoT2 m a ) @( LoT2 n a ) eta ( WrapRepK @e ( fromK a ) ) ) ) )

class GWeave f ( m :: * -> * ) ( n :: * -> * ) as bs where
  gweave :: ( forall x. m x -> n x ) -> f as -> f bs

instance GWeave ( RepK e ) m n ( LoT2 m a ) ( LoT2 n a ) => GWeave ( WrappedRepK e ) m n ( LoT2 m a ) ( LoT2 n a ) where
  gweave eta ( WrapRepK a ) =
    WrapRepK ( gweave eta a )


instance
  ( forall n a. GenericK e ( LoT2 n a )
  , forall m n a. GWeave ( WrappedRepK e ) m n ( m :&&: a :&&: LoT0 ) ( n :&&: a :&&: LoT0 )
  ) => Effect ( HigherOrder e ) where
  weave eta =
    weaveFromTo eta

newtype WrappedRepK r a =
  WrapRepK { unWrapRepK :: RepK r a }

我想是因为RepK是一个类型族所以..。有什么不对劲?我很想知道更多关于这个修复为什么有效的信息。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56771446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档