【发布时间】:2013-06-06 17:42:37
【问题描述】:
这到底是怎么回事:
"Couldn't match kind `*' against `#'"
我在 GHCi 中使用 TemplateHaskell (ghci -XTemplateHaskell) 尝试以下操作
$(reify ''Show >>= dataToExpQ (const Nothing))
我希望从中得到一个Exp(它确实有一个 Show 实例)。我这样做是为了在应用程序中插入有关 haskell 类型的信息,以便它可以作为实际数据使用,而不是作为字符串使用。
我的目标如下:
info :: Info
info = $(reify ''Show >>= dataToExpQ (const Nothing))
我真的不明白那个错误信息,'#'到底是什么?如果有#,是否还有# -> # 或* -> #?它是否与种类相关,就像种类与类型相关(尽管我不知道那可能是什么)?
好的,所以我现在明白 GHC 有一个种类的层次结构,而 `#' 是一种特殊的未装箱类型。一切都很好,但是为什么会弹出这个错误?也许未装箱的类型不能很好地与泛型配合使用?
我还不能完全确定这对我来说是否有意义,因为我认为未装箱类型是编译器执行的优化。我还认为,如果存在 Data 的实例,则它需要存在于所有可能包含在数据结构中的类型。
经过进一步调查,我认为 Names 提出了问题,有没有办法在 dataToExpQ 中规避它们?无论如何如何使用该参数?
【问题讨论】:
-
#是那种未装箱的类型,见stackoverflow.com/a/3034295/700253 -
感谢您的提示。所以:如何解决这个问题:-)?
标签: haskell ghc generic-programming template-haskell type-kinds