Jak*_*old 6 haskell yesod haskell-wai
我一直在玩Scotty Web框架,并尝试使用wai-handler-devel来启用代码重新加载.这是一个示例应用程序
{-# LANGUAGE OverloadedStrings #-}
module Example where
import Data.Monoid (mconcat)
import Network.Wai
import Web.Scotty
handler :: ScottyM ()
handler = get "/:word" $ do
beam <- param "word"
html $ mconcat ["<h1>Scotty, ", beam, " me up!</h1>"]
main :: IO ()
main = scotty 3000 handler
Run Code Online (Sandbox Code Playgroud)
这里的问题是wai-handler-devel期望得到一个(Application -> IO ()) -> IO ()使事情有效的功能,但在这种情况下我只有ScottyM ()和IO ().包Web.Scotty和Web.Scotty.Trans包中有一些功能,即以下内容
scottyApp :: ScottyM () -> IO Application这可以把我们handler变成IO Network.Wai.Application更接近wai-handler-devel预期的,但不完全是.
还scottyAppT :: 省略了类型签名 ......但在这种情况下,我甚至不确定如何读取类型签名.
我发现有一些wai-handler-devel仅在WAI应用程序上使用的例子,但我不知道如何将Scotty应用程序转换为具有所需签名的WAI应用程序.
我也想问一下,因为有人wai-handler-devel赞成使用yesod-bin,是否应该替换它,即使对于像这样的简单WAI/Scotty应用程序,还是yesod-bin只是为了yes应用程序?
事实证明这很容易.假设应用程序具有router类型为的函数router :: ScottyM ().
你正常运行应用程序的方式是
main :: IO ()
main = scotty 3000 router
Run Code Online (Sandbox Code Playgroud)
使这项工作唯一需要的wai-handler-devel是定义另一个函数,比如说dev,看起来像这样
dev :: (Application -> IO ()) -> IO ()
dev h = scottyApp router >>= h
Run Code Online (Sandbox Code Playgroud)
之后你只需要运行wai-handler-devel 3000 MyModule dev它就完美了:)
| 归档时间: |
|
| 查看次数: |
501 次 |
| 最近记录: |