- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何使用MonadBaseControl
来自 monad-control抬起simpleHTTP
happstack-server 中定义的函数?
simpleHTTP
的当前类型:
simpleHTTP :: ToMessage a
=> Conf -> ServerPartT IO a -> IO ()
simpleHTTPLifted
的预期类型:
simpleHTTPLifted :: (MonadBaseControl IO m, ToMessage a)
=> Conf -> ServerPartT m a -> m ()
我目前的尝试(不编译):
simpleHTTPLifted conf action =
liftBaseWith (\runInBase ->
let
fixTypes :: UnWebT m a -> UnWebT IO a
fixTypes c = runInBase c
in simpleHTTP conf (mapServerPartT fixTypes action)
)
请注意,类似的难题在我的相关问题中:MonadBaseControl: how to lift ThreadGroup
我想了解一般情况下如何提升此类功能以及遇到此类难题时通常采取的步骤是什么?
编辑:我想我需要一个类型为 (StM m a -> a)
的函数。 restoreM
非常接近,但没有成功。我还发现了一个丑陋的 fixTypes
版本:
fixTypes :: UnWebT m a -> UnWebT IO a
fixTypes c = do
x <- newIORef undefined
_ <- runInBase (c >>= liftBase . writeIORef x)
readIORef x
这依赖于 IO 作为基础 monad,这不是最佳解决方案。
最佳答案
我认为您一般无法为任何 MonadBaseControl IO m
解除此限制。有一些 m
我们可以做到。
UnWebT m
同构于 WebT m
它有一个 MonadTransControl
实例。您可以使用 mkWebT::UnWebT m a -> WebT m a
和 ununWebT::WebT m a -> UnWebT m a
与 WebT
相互转换。
MonadBaseControl
是一个奇特的包装器,围绕着一堆 MonadTransControl
更改器(mutator),它使堆栈变平,以便运行和恢复状态一直发生在堆栈中并一直返回再顶一下你可以通过理解 MonadTransControl
来理解 MonadBaseControl
,我将在这里简单地重复一下:
class MonadTrans t => MonadTransControl t where
data StT t :: * -> *
liftWith :: Monad m => (Run t -> m a) -> t m a
restoreT :: Monad m => m (StT t a) -> t m a
type Run t = forall n b. Monad n => t n b -> n (StT t b)
该类(class)用 liftWith
说,“我将提供一种在 m
中运行 t m
的临时方法,您可以使用它在 m
中构建操作,我将依次运行它。”结果的 StT
类型表示,“我在 m
中为您运行的 t m
结果不会普遍可用in t m
; 我需要在某个地方保存我的状态,如果你想要结果,你必须给我一个恢复我状态的机会。”
表达大致相同的另一种方式是,“我可以暂时解开基础 monad”。实现 fixTypes
的问题被简化为“鉴于我们可以暂时从 m
解包一个 WebT
并且可以暂时解包一个 m来自
,我们可以从 IO
的 IO
中永久解包 m
吗?”除非 IO
的功能,否则答案几乎肯定是“否”。
我怀疑存在 m
使得“丑陋的”fixTypes
会做一些可怕的事情,比如从不调用 writeIORef
并因此返回 undefined
或异步执行代码,因此在 readIORef
之后调用 writeIORef
。我不确定。由于 liftBaseWith
创建的操作可能永远不会在这种退化的情况下使用,因此这使得推理变得复杂。
当 monad m
的状态为 Comonad
时,应该有一种方法可以在不使用 IO
技巧的情况下提升 simpleHttp
因此有一个函数 extract::StM m a -> a
。例如,StateT s m
就是这种情况,它本质上具有 StM s a ~ (s, a)
。
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ScopedTypeVariables #-}
import Happstack.Server.SimpleHTTP
import Control.Comonad
import Control.Monad.Base
import Control.Monad.Trans.Control
simpleHTTPLifted :: forall m a. (MonadBaseControl IO m, Comonad (StM m), ToMessage a)
=> Conf -> ServerPartT m a -> m ()
simpleHTTPLifted conf action =
liftBaseWith (\runInBase ->
let
fixTypes :: UnWebT m b -> UnWebT IO b
fixTypes = fmap extract . runInBase
in simpleHTTP conf (mapServerPartT fixTypes action)
)
在实践中,这不是很有用,因为在旧版本的 monad-control 中定义的 newtype
没有 Comonad
实例,并且类型同义词在较新版本的 monad-control 不会努力将结果作为最后一个类型参数。例如,在最新版本的 monad-control type StT (StateT s) a = (a, s)
中。
关于haskell - MonadBaseControl : how to lift simpleHTTP from Happstack?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27733699/
我正在尝试扩展 Happstack crash course具有一些附加功能的博客:在主页上显示所有标签的列表。 我的博客记录是这样的: data Blog = Blog { nextPost
这是一个 Haskell 新手问题,可能与 IO() 相关。单子(monad)。 我在 Happstack.Server 中有一个函数生成文件上传响应的程序。 postFile = do method
我开始制作 Haskell 网络服务器。我决定从 Happstack 和 Happstack-state 开始。而且我感觉很难理解 Happstack 状态的概念和属性。它是一种新型数据库吗?还是只是
我找不到真正的方法来捕获 happstack 应用程序中纯函数引发的异常。我试过this solution 。当 IO 函数抛出异常时,它可以很好地工作。但是当纯函数抛出异常时它无法处理它。我的代码:
我对 Haskell 有点菜鸟,所以我不完全确定这是 Happstack 问题还是一般 Haskell 问题。 这是我遇到的困难的一个例子。这段代码“理论上”渲染了一些内容,但实际上抛出了一个错误:
我有一个简单的 hello world happstack 应用程序: module Main where import Happstack.Server (nullConf, simpleHTTP,
我想知道在 Happstack 网页中包含 CSS 的最佳方法是什么。我试过谷歌,没有运气,所以我想我会在这里问。 最佳答案 对我来说,最简单的方法是从静态文件夹中为它们提供服务。例如添加一个处理程序
happstack 教程提供了以下示例: main :: IO () main = simpleHTTP nullConf $ msum [ do methodM GET
我似乎找不到关于此主题的任何文档、任何博客文章或其他资源。 From what I have seen so far there seems to be support for FastCGI但是该项
如何使用MonadBaseControl来自 monad-control抬起simpleHTTP happstack-server 中定义的函数? simpleHTTP 的当前类型: simpleHT
谁能帮我“翻译”以下从 happs 到 happstack: module Main where import HAppS.Server.AlternativeHTTP import HAppS.Se
为什么我做不到 z = x? 但我能做到吗? y s = x s 我是 Haskell 新手 这就是我在 GHCi 中一直在尝试的: Prelude> import Happstack.Server
我尝试编写一个使用 SSL 的简单 Happstack 应用程序。使用此源代码: module Main where import Happstack.Server( ok ) import Happ
有没有办法在 Haskell 服务器端(最好使用 Happstack)使用安全的 websockets (wss://)? 我尝试在 Cabal 中搜索 websocket 服务器实现,我得到了 we
上周,我们三个人花了两天时间尝试使用 Happstack 构建一个简单的 Web 应用程序。 .我们关注的一个问题是身份验证,似乎曾经有一个 Happstack.Auth看起来真的很好的包裹。不幸的是
我想创建一个可以对数据库进行大量访问的 Happstack 应用程序。我认为底部带有 IO 的 Monad Stack 和顶部类似数据库写入的 monad(中间是日志写入器)将有助于在每次访问中具有清
每当我在网站中使用表单时,我都需要向它传递一个“action”属性(我不想将其留空,因为我更喜欢验证标记)。现在它看起来像这样: registerPage = dir "test" $ do
所以我有一个项目,我认为学习起来很简单,但又足够复杂,很有趣,我想使用 Happstack 库来编写。在最基本的层面上,这个项目只是一个花哨的文件服务器,带有一些特定于域的 REST 方法(或者其他什
除了 Method 数据类型没有 PATCH 的构造函数之外,我想知道是否可以在 Happstack 中匹配 PATCH 请求: data Method = GET | HEAD | POST | P
我正在尝试使用 Happstack 实现一个简单的请求处理程序: main :: IO () main = simpleHTTP nullConf app app :: ServerPart Resp
我是一名优秀的程序员,十分优秀!