首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Haskell错误:无法派生友好的实例/种类不匹配

Haskell错误:无法派生友好的实例/种类不匹配
EN

Stack Overflow用户
提问于 2012-07-15 08:10:21
回答 2查看 529关注 0票数 3

我在为Haskell中的日期结构派生Typeable1实例时遇到了问题。

这是我的代码:

代码语言:javascript
复制
    {-# LANGUAGE StandaloneDeriving #-}
    {-# LANGUAGE DeriveDataTypeable #-}

    import Data.Typeable (Typeable,Typeable1)

    newtype FooM m a = Foo { unFoo :: (a -> Bar m) -> Bar m }
    newtype Bar m = Atom (m (Maybe (Bar m)))
    type Baz m = Waldo (FooM m ())
    type Waldo a = a

    data Qux m = Qux {
        baz :: Baz m
      , num :: Int
    } -- deriving Typeable1 [1]

    -- deriving instance Typeable1 Qux [2]

取消对第一个注释1的注释会产生以下错误:

代码语言:javascript
复制
    Cannot derive well-kinded instance of form `Typeable1 (Qux ...)'
          Class `Typeable1' expects an argument of kind `* -> *'
        In the data type declaration for `Qux'

如果不注释2,则会出现以下错误:

代码语言:javascript
复制
    Kind mis-match
    The first argument of `Typeable1' should have kind `* -> *',
    but `Qux' has kind `(* -> *) -> *'
    In the stand-alone deriving instance for `Typeable1 Qux'

我的问题是:请问如何添加QuxTypeable/Typeable1实例?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-15 09:22:27

您不能使Qux成为Typeable1的实例,但在现代GHC中,您应该能够派生出Typeable的实例,它现在具有足够的多态性,可以处理这种更高级的类型,这使得Typeable1和类似的东西变得不必要。

过时的答案,之所以保留,是因为当有人问这个问题时,它是被接受的答案:不幸的是,你不能:对于(* -> *) -> *这类东西,Typeable层次结构没有任何类型类。既然GHC开始支持种类多态性,这个问题可能会在未来的某个时候得到解决。

票数 3
EN

Stack Overflow用户

发布于 2012-07-20 18:09:31

似乎这个问题目前正在ghc门票#5391中考虑。因此,deriving Typeable问题有可能在GHC7.6中消失。

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

https://stackoverflow.com/questions/11488379

复制
相关文章

相似问题

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