我在为Haskell中的日期结构派生Typeable1
实例时遇到了问题。
这是我的代码:
{-# 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'
我的问题是:请问如何添加Qux
的Typeable
/Typeable1
实例?
发布于 2012-07-15 09:22:27
您不能使Qux
成为Typeable1
的实例,但在现代GHC中,您应该能够派生出Typeable
的实例,它现在具有足够的多态性,可以处理这种更高级的类型,这使得Typeable1
和类似的东西变得不必要。
过时的答案,之所以保留,是因为当有人问这个问题时,它是被接受的答案:不幸的是,你不能:对于(* -> *) -> *
这类东西,Typeable
层次结构没有任何类型类。既然GHC开始支持种类多态性,这个问题可能会在未来的某个时候得到解决。
发布于 2012-07-20 18:09:31
似乎这个问题目前正在ghc门票#5391中考虑。因此,deriving Typeable
问题有可能在GHC7.6中消失。
https://stackoverflow.com/questions/11488379
复制相似问题