在原型设计期间逃离IO Monad

时间:2014-02-22 15:09:34

标签: haskell ghci

如何让GHCI原型设计更加强大?因为我从文件中读取数据,所以我被锁定在IO monad中。每次缝合liftM都有点令人沮丧。

λ: 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}]]
λ

2 个答案:

答案 0 :(得分:13)

由于gchi在IO中,您可以使用<-而不是让绑定变量

xml <- loadFromFile
q xml

答案 1 :(得分:0)

let<-的主要缺点是重新加载后会丢失所有绑定。要在源文件中使用永久绑定,您还可以使用unsafePerformIO :: IO a -> a中的System.IO.Unsafe。它在生产代码中非常不合适(只有当你真正知道你做了什么 - 例如一些低级优化和hackery时),但在原型设计过程中是完全可以接受的。