无法派生此类型的泛型?

时间:2018-11-27 11:31:23

标签: haskell metaprogramming typeclass deriving

在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?为什么?

1 个答案:

答案 0 :(得分:5)

Generic1 Foo无法派生,因为Generic1是针对* -> *而非(* -> *) -> *类型的类型。原则上可以在(* -> *) -> *中使用更多构造函数来支持GHC.Generics,但是这种方法的伸缩性不好(它附带了很多不直观的语法限制,您将始终遇到相同的问题更复杂的类型)。

实际上,您可以使用简单的Generic来做很多事情,这些平原与Generic1的最初预期用例重叠。否则,您将需要比GHC.Generics更强大的功能,例如最近发布的kind-generics(包括指向纸张和黑客的链接)。