Рассмотрим этот код:Почему этот шаблон Haskell работает?
magic :: String -> Q Exp magic s = [e| putStrLn s |]
Теперь, как лучше, как я могу сказать, что это не должно реально работать. Внутри кронштейнов Оксфорда s
не входит в объем. И все же, все это, видимо, прекрасно работает.
Если немного изменить этот пример, теперь он ломает ужасно:
magic :: Exp -> Q Exp magic (VarE n) = [e| putStrLn (nameBase n) |]
Так же, как и раньше, мы имеем переменную не входят в комплект. И это время, он ломается. Но он не жалуется на переменную, которая не входит в сферу охвата; вместо этого он скулит о каком-то недокументированном классе, лишенном экземпляра.
Кто-нибудь знает, что происходит?
Как вы управляете монадами Q? Обычно вещи выполняются во время компиляции, но некоторые из них работают в режиме исполнения, а вещи более хрупкие. –