haskell - 派生方式:无法派生良好的实例
问题描述
当我尝试派生实例时遇到此错误。
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 行看到我基于类型并尝试在此处派生的数据类型和实例。我不习惯使用派生方式 - 谁能解释这个错误的含义以及我将如何解决它?
解决方案
问题在于,(* -> *, *)
或者,等效地,(Type -> Type, Type)
是一种类型级别的元组,必须启用DataKinds
andPolyKinds
扩展才能处理它。(我不完全确定为什么PolyKinds
需要;也许是为了允许更一般的类型推断。)
对于具有复杂种类的数据类型,明确启用并给出种类签名通常是一个好主意:StandaloneKindSignatures
import Data.Kind
type ControlFlowCMD :: (Type -> Type, Type) -> Type -> Type
newtype ControlFlowCMD fs a = ...
推荐阅读
- angular - 无法获取输入电台列表
- selenium - 在 Jenkins 中运行我的测试用例时出现错误“java.lang.AssertionError:不支持的类型参数”
- java - 找不到类 org.glassfish.jersey.internal.inject.Binder
- scala - 无法使用 SBT 从 Maven 下载 lwjgl3-awt
- firebase - 云功能响应
- javascript - 在 iisnode 中运行 nodejs 得到 http://localhost/node/polyfills.c466c90744ce632ac8b9.js net::ERR_ABORTED 500(URL 重写模块错误。)
- javascript - 当任何动态导入无法加载文件时,如何手动加载 webpack 异步块?
- java - 将日期转换为 GMT
- web-scraping - 如何解释这个 robots.txt 文件?
- javascript - 重新加载父窗口