我在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'
我的问题是:如何添加Typeable
Typeable1
Qux
个实例?
答案 0 :(得分:3)
你不能让Qux
成为Typeable1
的实例,但在现代GHC中,你应该能够派生出一个Typeable
的实例,它现在已经足够多态了处理这种更高级的类型,使Typeable1
及其同类不必要。
过时的答案,保留是因为在提出问题时这是接受的答案:不幸的是,您不能:Typeable
层次结构没有任何类型(* -> *) -> *
的类型类。由于GHC开始支持种类多态性,因此可能会在未来的某个时间修复。
答案 1 :(得分:0)
似乎ghc票证#5391中正在考虑此问题。因此,deriving Typeable
问题可能会在GHC 7.6中消失。