派生通过:无法派生良种实例

Deriving Via: Cannot derive well-kinded instance

我在尝试派生实例时遇到此错误。

Cannot derive well-kinded instance of form ‘HFunctor (ControlFlowCMD ...)’
    Class ‘HFunctor’ expects an argument of kind ‘(* -> *, *)
                                                  -> * -> *’
• In the newtype declaration for ‘ControlFlowCMD’

我正在尝试这样做:

newtype ControlFlowCMD fs a = ControlFlowCMD (ControlCMD fs a)
  deriving HFunctor via (ControlCMD fs a)

您可以在第 278 行看到我基于我的类型并尝试派生 here 的数据类型和实例。我不习惯使用派生 via - 谁能解释这个错误的含义以及我将如何修复它?

问题是 (* -> *, *) 或等价地 (Type -> Type, Type) 是一个种类级别的元组,必须启用 DataKinds and PolyKinds 扩展才能处理它。 (虽然我不完全确定为什么需要 PolyKinds;也许是为了允许更一般的种类推断。)

对于具有复杂种类的数据类型,它通常是 good idea to enable StandaloneKindSignatures 并明确给出种类签名:

import Data.Kind
type ControlFlowCMD :: (Type -> Type, Type) -> Type -> Type
newtype ControlFlowCMD fs a = ...