次のコードを検討してください。
マジック :: 文字列 -> Q Exp マジック s = [e| putStrLns |]
さて、私が知る限り、これは実際には機能しないはずです。オックスフォード ブラケットの内側はs
対象外です。それでも、上記は明らかに完全に機能します。
この例を少し変更すると、ひどく壊れます。
マジック :: Exp -> Q Exp マジック (VarE n) = [e| putStrLn (nameBase n) |]
前と同じように、スコープ外の変数があります。そして今度は壊れる。しかし、スコープ外の変数については文句を言いません。代わりに、インスタンスがない文書化されていないクラスについて泣き言を言います。
いったい何が起こっているのか知っている人はいますか?