首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Scotty中在编译时动态添加路由

在Scotty中在编译时动态添加路由
EN

Stack Overflow用户
提问于 2015-05-16 15:59:08
回答 1查看 179关注 0票数 0

是否可以使用模板Haskell或任何其他方式在编译时通过配置文件动态添加路由。

Scotty有一个函数addRoute,但我想动态使用它。

示例

代码语言:javascript
复制
import qualified Data.Text.Lazy as LTB

sampleRoutes :: [(String, LTB.Text)]
sampleRoutes = [("hello", LTB.pack "hello"), ("world", LTB.pack "world")]

我想在sampleRoutes数组上迭代,并在编译时定义路由和响应。

代码语言:javascript
复制
import Web.Scotty

main = scotty 3000 $ do
  middleware logStdoutDev
  someFunc sampleRoutes
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-18 12:31:56

好的,考虑到上面的列表,我假设您正在寻找的东西相当于手工编写以下内容:

代码语言:javascript
复制
{-! LANGUAGE OverloadedStrings #-}
import Web.Scotty
import Data.String

main = scotty 3000 $ do
  middleware logStdoutDev
  get (fromString $ '/' : "hello") (text "hello")
  get (fromString $ '/' : "world") (text "world")

好消息是,里面没有任何东西需要任何魔法!

请记住,addroute / get只是返回ScottyM ()值的常规函数。如果我有

代码语言:javascript
复制
r1 = get (fromString $ '/' : "hello") (text "hello")
r2 = get (fromString $ '/' : "world") (text "world")

然后前面的main函数完全等价于

代码语言:javascript
复制
main = do
  middleware logStdoutDev
  r1
  r2

这一点以及r1r2的共同结构提出了以下解决方案:

代码语言:javascript
复制
import Control.Monad (forM_)

main = do
  middleware logStdoutDev
  forM_ sampleRoutes $ \(name, response) -> 
    get (fromString $ '/':name) (text response)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30277790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档