首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Hamlet模板中压缩if-then-else

在Hamlet模板中压缩if-then-else
EN

Stack Overflow用户
提问于 2018-08-31 06:29:17
回答 1查看 216关注 0票数 0

我正在尝试理解Yesod的“哈姆雷特”中的变量插值,特别是实现if-then-else-like逻辑。假设我想根据整数x的值添加CSS样式。x来自模板中的for循环,即我无法从Haskell代码访问它。

期望的结果:

代码语言:javascript
复制
<span class="even positive">2</span>
<span class="odd positive">13</span>
<span class="odd non-positive">-1</span>
<span class="even non-positive">0</span>

尝试内联if

代码语言:javascript
复制
<span class="#{if even x then "even" else "odd"} ...">#{x}</span>

尝试使用$with

代码语言:javascript
复制
$with cls <- (if even x then "even" else "odd")
    <span class="#{cls}">#{x}</span>

两者都不起作用;两者都会导致

代码语言:javascript
复制
• Illegal variable name: ‘if’
  When splicing a TH expression

显然,#{...}解析器中没有实现Haskell语法的这一部分。有没有一种干净利落的方法呢?我现在只能看到一条出路,而且它丑陋得像地狱:

代码语言:javascript
复制
$if ((even x) && (x > 0))
    <span class="even positive">#{x}</span>
$elseif (even x)
    <span class="even non-positive">#{x}</span>
$elseif (x > 0)
    <span class="odd positive">#{x}</span>
$else
    <span class="odd non-positive">#{x}</span>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-31 06:58:20

这些模板表达式中不支持大多数Haskell语法。我认为这是设计出来的,因为你不希望你的模板包含复杂的业务逻辑。

我会把代码写成Haskell端的一个函数,然后从模板中调用它。类似于:

代码语言:javascript
复制
-- .hs file
altclass, signclass :: Int -> String
altclass x = if even x then "even" else "odd"
signclass x = if x > 0 then "positive" else "non-positive"

-- .hamlet file
<span class="#{altclass x} #{signclass x}">#{x}</span>

这样做可以正确地将业务逻辑从模板中分离出来,但仍然允许您使用模板内变量。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52106167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档