编码具有良好形式的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
当用户位于SearchFormR
或SearchResultsR
上时,此链接应突出显示。
<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网站的源代码,但找不到答案
Sibi在评论中给出的答案(谢谢Sibi)是问题中的第二种方法形式/风格都很好。
例如在小村庄::(isThisRouteSearchResultsROrSearchR mcurrentRoute) :.active
或者可以做:(isThisRouteSearchResultsR mcurrentRoute) || (isThisRouteSearchR mcurrentRoute) :.active
然后您根据问题代码在Foundation.hs(Haskell)中定义这些功能。
Sibi:
目标通常是将所有逻辑保留在Haskell文件中,将其最小化到Hamlet文件中。
感谢您的指导,