我正在使用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)
答案 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
一起运行。