Navigating Haskell Servant API with Lucid WebUI



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

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)) ...

您还可以通过使用 AllowAmbiguousTypes 定义帮助程序来缩短symbolVal调用:

{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
urlpath :: forall s . KnownSymbol s => String
urlpath = symbolVal (Proxy :: Proxy s)
html = ... href_ (urlpath @UserSite) ...

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

相关内容

  • 没有找到相关文章

最新更新