haskell - Yesod 将 getCurrentRoute 与具有动态参数的路由进行比较

标签 haskell yesod

以良好的形式对 haskell 进行编码的问题,而不是“它有效”。

当用户位于该页面时,我们希望菜单导航项具有突出显示的 CSS 类。

简单。

这是我的路线:

...
/simple SimpleR GET POST
/search SearchFormR GET POST
/searchresults/#Int/#Text SearchResultsR GET 
...

在我的小村庄模板中,我有以下内容。这非常有效,当用户位于该页面上时,链接会突出显示。路线很简单。

<li .nav-item>
    <a .nav-link :Just SimpleR == mcurrentRoute:.active href=@{SimpleR}>
        Simple page

当用户使用 SearchFormRSearchResultsR 时,应突出显示此链接。

<li .nav-item>
   <a .nav-link :((Just (SearchResultsR _ _)) == mcurrentRoute) || (Just SearchFormR == mcurrentRoute):.active href=@{SearchFormR}>
       Search

此代码不起作用,因为 SearchResultsR 路由构造函数需要传递给它的两个内容。我无法像上面那样编写 _ _ ,因为构造函数需要一个文字值。此外,无论如何,构造函数的结果都会与实际路由进行比较,除非两个参数恰好相同,否则它不会匹配。

如果没有 _ _ 我当然会得到一个类型错误,期望另外两个东西传递给 SearchResultsR 构造函数。

也就是说,我想检查我们是否位于任何 SearchResultsR 路线上,而不仅仅是匹配 SearchResultsR 123 "abc"

我的第一个想法是创建一个函数将路由转换为字符串,然后检查该字符串是否包含路由的字符串,但这很糟糕,而不是 haskell/类型安全的方式。

我的第二次尝试是使用模式匹配:

基础.hs:

isThisRouteSearchResultsR :: Maybe (Route App) -> Bool
isThisRouteSearchResultsR (Just (SearchResultsR _ _)) = True
isThisRouteSearchResultsR _ = False

哈姆雷特模板:

<li .nav-item>
   <a .nav-link :(isThisRouteSearchResultsR mcurrentRoute) || (Just SearchR == mcurrentRoute) :.active href=@{SearchR}>
       Search

但这似乎并没有好多少。如果我有更多包含动态部分的路线怎么办? 执行此操作的正确方法是什么?我查看了 haskellers 网站源代码,但找不到答案

最佳答案

Sibi 在评论中给出的答案(谢谢 Sibi)是问题中的第二种方法形式/风格良好。

例如在小村庄: :(isThisRouteSearchResultsROrSearchR mcurrentRoute) :.active

或者可以做 :(isThisRouteSearchResultsR mcurrentRoute) || (isThisRouteSearchR mcurrentRoute) :.active

并且您根据问题代码在 Foundation.hs (Haskell) 中定义这些函数。

丝碧:

The goal is to usually keep all your logic in the Haskell file and keep it minimal in the Hamlet file.

感谢 Sibi 的指导。

关于haskell - Yesod 将 getCurrentRoute 与具有动态参数的路由进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59391777/

相关文章:

haskell - 使用 ContT 的列表迭代器

haskell - 没有由文字 ‘0’ 产生的 (Num Bool) 实例

string - 在 Haskell 中如何获取 UTF8 字符串中的字节数?

yesod - 在Ubuntu 13.10上设置Yesod

haskell - Yesodweb如何使用静态目录下的图片作为背景?

haskell - Yesod - 如何让 addScriptRemote 在头部添加脚本?

algorithm - 线程二叉树结构在 Haskell 中有什么优势吗?

scala - 在函数列表上折叠 flatMap/bind(也就是命名组合器!)

haskell - 使用 SIGUSR1 重新加载 yesod 网站的内容

haskell - 如何在 Yesod Application 中的 GHCi 中执行数据库查询