2014-02-22 21 views
2

如何讓我的GHCI原型設計更加強大?我被鎖定在IO monad中,只是因爲我從文件中讀取了數據。每次都需要拼接liftM,這有點令人沮喪。在原型設計過程中逃脫IO Monad

λ: let q xml = fmap (filterChildrenName f) $ elChildren xml 
λ: liftM q xml 
[[Element {elName = QName {qName = "link", qURI = Nothing, qPrefix = Nothing}, elAttribs = [], elContent = [Text (CData {cdVerbatim = CDataText, cdData = "http://planet.haskell.org/", cdLine = Nothing})], elLine = Nothing}]] 
λ 
+0

您可以有效地將您在GHCi中運行的每個命令都視爲處於IO monad中,而不需要解除。 –

+0

你也可以使用'Control.Applicative'。它爲fmap('<$>')引入了一個別名,它使事情看起來更漂亮一點,並且還引入了'<*>',您可以使用它來代替fmap(再次,使事情看起來更好)。 – Cubic

回答

12

由於GCHI是在IO,可以使用<-反而讓的綁定變量

xml <- loadFromFile 
q xml 
0

let<-的主要缺點是,你失去所有綁定後重裝。要在源文件中使用永久綁定,您還可以使用System.IO.Unsafe中的unsafePerformIO :: IO a -> a。在生產代碼中這是非常不合適的(只有當你真的知道你在做什麼時 - 例如一些低級別的優化和駭客),但是在原型製作期間完全可以接受。