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

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.ScottyWeb.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应用程序?

Jak*_*old 6

事实证明这很容易.假设应用程序具有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它就完美了:)