使用 Lucid WebUI 导航 Haskell Servant API
Navigating Haskell Servant API with Lucid WebUI
我了解到我可以通过以下方式用 servant 和 Lucid 定义我的 API:
type ClientAPI =
"users" :> Get '[HTML] (Html ())
:<|> "userdata" :> Get '[HTML] (Html ())
然后如果我想添加一个 link 到我的 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)) ...
您还可以通过使用 AllowAmbiguousTypes
:
定义助手来缩短 symbolVal
调用
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
urlpath :: forall s . KnownSymbol s => String
urlpath = symbolVal (Proxy :: Proxy s)
html = ... href_ (urlpath @UserSite) ...
(我实际上认为它在某个地方的标准库中,但我找不到它。)
我了解到我可以通过以下方式用 servant 和 Lucid 定义我的 API:
type ClientAPI =
"users" :> Get '[HTML] (Html ())
:<|> "userdata" :> Get '[HTML] (Html ())
然后如果我想添加一个 link 到我的 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)) ...
您还可以通过使用 AllowAmbiguousTypes
:
symbolVal
调用
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
urlpath :: forall s . KnownSymbol s => String
urlpath = symbolVal (Proxy :: Proxy s)
html = ... href_ (urlpath @UserSite) ...
(我实际上认为它在某个地方的标准库中,但我找不到它。)