6

我一直在使用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

这里的问题是wai-handler-devel期望获得一个(Application -> IO ()) -> IO ()使事情正常进行的函数,但在这种情况下,我只有ScottyM ()and 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 是否仅适用于 yesod 应用程序?

4

1 回答 1

6

这实际上变得相当容易。假设应用程序有一个router类型为router :: ScottyM ().

您通常运行应用程序的方式是

main :: IO ()
main = scotty 3000 router

唯一需要做的wai-handler-devel就是定义另一个函数,比如说dev,看起来像这样

dev :: (Application -> IO ()) -> IO ()
dev h = scottyApp router >>= h

之后你只需要运行wai-handler-devel 3000 MyModule dev它就可以完美运行:)

于 2014-04-17T09:01:53.473 回答