考慮以下代碼:爲什麼這個模板Haskell的工作?
magic :: String -> Q Exp magic s = [e| putStrLn s |]
現在,作爲最好的,我可以告訴大家,這不應該實際工作。在牛津括號內,s
不在範圍內。然而,上述顯然完美的作品。
如果我們稍微改變這個例子,現在打破可怕:
magic :: Exp -> Q Exp magic (VarE n) = [e| putStrLn (nameBase n) |]
和以前一樣,我們在範圍上有一個變量不是。和這個時間,它打破。但它並不抱怨一個不在範圍內的變量;相反,它會抱怨一些缺乏實例的無證班級。
任何人都知道這是怎麼回事?
你如何運行Q monads?通常情況下,編譯時會完成,但有些使用會在運行時結束,而且事情更加脆弱。 – 2012-03-06 17:18:39