我试图理解 Yesod 的 Hamlet 中的变量插值,特别是实现 if-then-else-like 逻辑。假设我想根据整数的值添加 CSS 样式x
。x
来自模板中的 for 循环,即我无法从 Haskell 代码中访问它。
期望的结果:
<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
:
<span class="#{if even x then "even" else "odd"} ...">#{x}</span>
尝试使用$with
:
$with cls <- (if even x then "even" else "odd")
<span class="#{cls}">#{x}</span>
两者都不起作用;两者都导致
• Illegal variable name: ‘if’
When splicing a TH expression
显然,#{...}
解析器中没有实现 Haskell 语法的一部分。有没有一种干净的方法可以做到这一点?我目前只能看到一种出路,而且非常丑陋:
$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>