haskell - 使用 Lucid WebUI 导航 Haskell Servant API

标签 haskell routes servant haskell-lucid

我了解到我可以通过以下方式使用servant和Lucid定义我的API:

type ClientAPI = 
    "users" :> Get '[HTML] (Html ()) 
    :<|> "userdata" :> Get '[HTML] (Html ())

然后,如果我想在 HTML 中添加指向其中一个端点的链接,我可以使用 Lucid 提供的“a_”函数,例如

a_ [href_ "users"] "Show users"

这种方法的问题是我需要重复端点的名称两次。 “users”同时出现在 API 定义和 a_ 标记中。结果,如果我在一个地方更改它,另一个地方会立即停止工作。

有没有办法定义一个可以在两个地方使用的符号?像这样的东西:

data MySites = UserSite | UserDataSite -- potentially more

type ClientAPI' =
    UserSite :> Get '[HTML] (Html ())
    -- ......

let html =
...
   a_ [href_ UserSite] "Show users"
...

最佳答案

如果您只想抽象字符串“user”,您可以使用类型别名来完成此操作,然后使用 GHC.TypeLits.symbolVal获取值级别的字符串:

{-# LANGUAGE DataKinds #-}

import Data.Proxy
import GHC.TypeLits

type UserSite = "user"

html = ... href_ (symbolVal (Proxy :: Proxy UserSite)) ...

您还可以通过使用 AllowAmbigouslyTypes 定义帮助器来缩短 symbolVal 调用的时间:

{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE AllowAmbiguousTypes #-}

urlpath :: forall s . KnownSymbol s => String
urlpath = symbolVal (Proxy :: Proxy s)

html = ... href_ (urlpath @UserSite) ...

(我实际上认为类似的东西在标准库中的某个地方,但我找不到它。)

关于haskell - 使用 Lucid WebUI 导航 Haskell Servant API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59011326/

相关文章:

haskell - 如何编写数据的 "Show"Typeclass

angular - 使用 Angular 获取路由参数的最佳方法

asp.net-mvc-4 - 如何向MVC4添加多条路由

haskell - 理解为什么 MVar 不更新?

Haskell:针对 Hackage 的多个版本的 base 测试包

haskell - 缺乏对无限列表和 seq 运算符的理解

scala - 图灵完备类型系统的原因是什么

exception - 测试 Twig 模板中是否存在路由 (Symfony 2)

haskell - IO 操作是否可以在将逻辑保持在纯函数中的同时进行排序?

haskell 仆人 : How to deal with invalid Accept header (or ignore it completely)