是,将getCurrentRoute与具有动态参数的路由进行比较

问题描述 投票:3回答:1

编码具有良好形式的haskell的问题,而不是'it works'。

我们希望菜单导航项在用户位于该页面上时具有突出显示的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 / typesafe方法。

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

Foundation.hs:

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

Hamlet模板:

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

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

haskell yesod
1个回答
0
投票

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

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

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

然后您根据问题代码在Foundation.hs(Haskell)中定义这些功能。

Sibi:

目标通常是将所有逻辑保留在Haskell文件中,将其最小化到Hamlet文件中。

感谢您的指导,

© www.soinside.com 2019 - 2024. All rights reserved.