如何使用Scotty设置wai-handler-devel以自动重新加载代码?

时间:2014-04-05 17:19:36

标签: haskell yesod haskell-wai

我一直在玩Scotty web framework,并试图让它与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 ()IO ()Web.ScottyWeb.Scotty.Trans包中有一些功能,即以下

scottyApp :: ScottyM () -> IO Application这可以将我们的handler转换为IO Network.Wai.Application,这更接近wai-handler-devel预期的结果,但不完全正确。

还有scottyAppT :: type signature omitted ...但在这种情况下,我甚至不确定如何阅读类型签名。

我发现仅在WAI应用程序上有some examples of using wai-handler-devel,但我不知道如何将Scotty应用程序转换为具有所需签名的WAI应用程序。

我还想问一下,因为wai-handler-devel被弃用而不是yesod-bin,所以即使对于像这样的简单WAI / Scotty应用程序,也应该替换它,或者是yesod-bin只是为了yesod应用程序?

1 个答案:

答案 0 :(得分: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,这一切都完美无缺:)