在GHC 8.6.2上编译此简短代码段:
{-# LANGUAGE DeriveGeneric, PolyKinds #-}
import GHC.Generics
data Foo f
= FA
| FB (f (Foo f))
deriving (Generic, Generic1)
导致此错误:
Can't make a derived instance of ‘Generic1 Foo’:
Constructor ‘FB’ applies a type to an argument involving the last parameter
but the applied type is not of kind * -> *
是否无法为此类类型派生Generic
?为什么?
答案 0 :(得分:5)
Generic1 Foo
无法派生,因为Generic1
是针对* -> *
而非(* -> *) -> *
类型的类型。原则上可以在(* -> *) -> *
中使用更多构造函数来支持GHC.Generics
,但是这种方法的伸缩性不好(它附带了很多不直观的语法限制,您将始终遇到相同的问题更复杂的类型)。
实际上,您可以使用简单的Generic
来做很多事情,这些平原与Generic1
的最初预期用例重叠。否则,您将需要比GHC.Generics
更强大的功能,例如最近发布的kind-generics(包括指向纸张和黑客的链接)。