Я пытаюсь понять интерполяцию переменных в «Гамлете» Йесода, в частности, реализуя логику «если-то-иначе». Допустим, я хочу добавить стили 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>