2

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

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 行看到我基于类型并尝试在此处派生的数据类型和实例。我不习惯使用派生方式 - 谁能解释这个错误的含义以及我将如何解决它?

4

1 回答 1

2

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

对于具有复杂种类的数据类型,明确启用并给出种类签名通常是一个好主意:StandaloneKindSignatures

import Data.Kind
type ControlFlowCMD :: (Type -> Type, Type) -> Type -> Type
newtype ControlFlowCMD fs a = ...
于 2021-01-28T10:51:20.347 回答