【发布时间】:2019-05-30 15:06:02
【问题描述】:
我的目标是使用HtmlT m 类型(最好是Html ())正确地提供html 函数(如Spock-core 中定义的那样)。在这之间,我正在执行一些 Network.Http.Simple 请求。显然我对Haskell的了解不够,我没有找到强制正确单子的方法。据我所知(并且理解 monad 的全部含义),没有办法像 (Monad M, Monad N => M a -> (a -> N b) -> N b) 这样组合不同的 monad。
我设法实现的最好的方法是设置一个HtmlT IO () 类型,但后来我陷入了转换函数lucid :: HtmlT IO () -> SpockAction dtb sess state ()
这是我的连接函数(Auth 是一个 FromJSON 数据结构,用于托管授权密钥和令牌)
connect :: IO Auth
connect = do
...building a http request..
response <- httpJSON request
return (getResponseBody response :: Auth)
接下来,它被连接到 String -> HtmlT IO () 类型的 getRequest 函数中
getRequest :: RequestPath -> HtmlT IO ()
getRequest rpath = do
atoken <- liftIO connect
request' <- liftIO parseRequest "http://......"
let request = { series of set methods
to build the request }
response <- httpLBS request
liftIO (L8.putStrnLn $ (getResponseBody response))
这里我们来到了 lucid 函数,Lucid 可以处理转换Html () -> SpockAction ...。 Html () 只不过是 HtmlT Identity (),所以我的第一次尝试是用 HtmlT IO () 喂 Lucid。
lucid :: HtmlT IO () -> SpockAction database session state ()
lucid document = do
txt <- renderTextT document --> inside IO (?)
return html (TL.toStrict txt) <-- naive attempt to
return to "somewhere" of course stupid..
也许IO 不是这里的好单子?当我尝试 Identity monad(拥有HtmlT Identity ())时,如果我将 connect 定义为 connect :: Identity Auth,那么自然会要求我提供 Identity 的 FromJSON 实例(源于使用 httpJSON),也许这曾经是一个潜在的解决方案我在 Identity monad 中,我能够将事情连接起来,并可能以干净的 Html () 类型结束,然后我的 lucid 函数将顺利执行。
感谢您提供任何线索或提示,也许我的方法完全错误我正在做的整个事情是查询一个 restAPI 网站并在使用 Spock 运行的网络服务器上查看结果。
【问题讨论】:
-
请包含具体的编译器错误,准确复制。另外,这是您的确切实际来源吗?
getRequest应该无法编译,因为liftIO parseRequest "http://......"向liftIO传递了太多参数,但您似乎在编写该函数是正确/完整的。 -
在我的实际代码中 lucid is undefined ``` lucid= undefined ``` 其他一切编译正确。 getRequest compile 不要在这里阅读我的定义,我跳过了负责构建请求的部分,该函数的最后一次调用是来自 putStrLn 的 IO 提升结果(即 IO () )
-
我刚刚修复了你的标签。我猜你不想要 spock 因为它指的是用 Groovy 编写的测试框架。我用 haskell-spock 替换了它,希望它指的是您正在谈论的 Web 开发框架。
标签: html haskell haskell-spock haskell-lucid