3

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

这是我的代码:

    {-# 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] 会出现此错误:

    Cannot derive well-kinded instance of form `Typeable1 (Qux ...)'
          Class `Typeable1' expects an argument of kind `* -> *'
        In the data type declaration for `Qux'

取消注释 [2] 会出现此错误:

    Kind mis-match
    The first argument of `Typeable1' should have kind `* -> *',
    but `Qux' has kind `(* -> *) -> *'
    In the stand-alone deriving instance for `Typeable1 Qux'

我的问题是:请问如何添加Typeable/Typeable1实例Qux

4

2 回答 2

3

您不能创建Qux的实例Typeable1,但在现代 GHC 中,您应该能够派生 的实例Typeable,该实例现在具有足够的种类多态性,可以处理此类更高种类的类型,因此Typeable1无需再进行类似操作。

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

于 2012-07-15T01:22:27.423 回答
0

似乎这个问题目前正在 ghc 票证中考虑,#5391。所以这个deriving Typeable问题有可能在 GHC 7.6 中消失。

于 2012-07-20T10:09:30.990 回答