我一直在玩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.Scotty
和Web.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应用程序?
答案 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
,这一切都完美无缺:)