Get '[HTML] (Html ()) : "-6ren">
gpt4 book ai didi

haskell - 使用 Lucid WebUI 导航 Haskell Servant API

转载 作者:行者123 更新时间:2023-12-04 10:58:30 25 4
gpt4 key购买 nike

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

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

然后,如果我想在 HTML 中的端点之一添加链接,我可以使用 Lucid 提供的“a_”函数,例如
a_ [href_ "users"] "Show 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)) ...

您也可以制作 symbolVal通过使用 AllowAmbiguousTypes 定义一个助手来缩短调用时间:
{-# 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com