ここで一体何が起こっているのですか:
"Couldn't match kind `*' against `#'"
TemplateHaskellを使用してGHCiで次のことを試していました(ghci -XTemplateHaskell
)
$(reify ''Show >>= dataToExpQ (const Nothing))
私はこれから抜け出すことを望んExp
でいました(これにはShowのインスタンスがあります)。Haskell 型に関する情報をアプリケーションに挿入して、文字列ではなく実際のデータとして利用できるようにするためにこれを行っています。
私の目標は次のとおりです。
info :: Info
info = $(reify ''Show >>= dataToExpQ (const Nothing))
エラー メッセージの意味がよくわかりません。「#」とは何ですか? ある場合は#
、それもあります# -> #
か* -> #
?種類が型に関連するような種類に関連するものですか (それが何であるかはわかりませんが)?
さて、GHC には種類の階層があり、`#' はボックス化されていない特別な種類の型であることがわかりました。問題ありませんが、なぜこのエラーが表示されるのでしょうか? ボックス化されていない型はジェネリックとうまく機能しないのでしょうか?
ボックス化されていない型はコンパイラによって実行される最適化であると考えるため、これが私にとって意味があるかどうかはまだ完全にはわかりません。また、Data のインスタンスが存在する場合、データ構造に含まれる可能性のあるすべての型に対して存在する必要があると考えました。
さらに調査したところ、名前が問題を引き起こしていると思いますが、dataToExpQ でそれらを回避する方法はありますか? とにかくその引数を使用する方法は?