如何从BrowserAction monad中提取BrowserState?

时间:2012-01-25 13:50:41

标签: haskell

我正在使用network-http包(http://hackage.haskell.org/package/HTTP-4000.2.2)将http客户端编码为学习项目。

有一个Network.Browser模块,它定义了getBrowserState函数。

可能只是一个蹩脚的初学者问题,但是如果Network.Browser模块没有导出数据构造函数或记录的提升功能,如何从BrowserAction monad获取BrowserState记录?

import Network.Browser

-- getBrowserState :: BrowserAction t (BrowserState t)

extractBS :: BrowserAction t (BrowserState t) -> BrowserState t
-- ??? implementation ???

另外还有关于bsCookies,bsDebug,bsProxy等BrowserState字段的进一步处理呢? (http://hackage.haskell.org/packages/archive/HTTP/4000.2.2/doc/html/src/Network-Browser.html#BrowserState

1 个答案:

答案 0 :(得分:4)

你想要做的事情并没有多大意义。 BrowserAction描述了一个操作,而BrowserState描述了操作中某个时刻浏览器的当前状态。

BrowserAction获取内容的唯一方法是使用browse函数运行它。

browse :: BrowserAction conn a -> IO a

这与你无法从Something获得IO Something的原因基本相同,除非你有browse函数允许你“从中获取东西”运行它的浏览器操作。

例如,您可以执行一个操作,在原始操作之后提取当前浏览器状态并运行:

browse (action >> getBrowserState) :: IO (BrowserState conn)

请注意此处类型中的IO,因为运行该操作可能会产生副作用。

那就是说,我怀疑你真正想要的是让需要当前浏览器状态的代码成为动作的一部分。

browse $ do action
            state <- getBrowserState
            -- do stuff with the state

请注意,BrowserAction有一个MonadIO个实例,因此您仍然可以使用IO来处理liftIO个内容。

browse $ do -- browsing
            liftIO $ putStrLn "foo"
            -- more browsing

换句话说,你不应该把它想象成BrowserAction。您应该考虑如何将BrowserAction中与浏览相关的代码部分与browse一起运行。