Отдельные элементы списка вывода по разделителю в хамлете
Если у меня есть код ниже, как мне избавиться от последней запятой в выводе? Есть ли способ узнать, где я в цикле и нахожусь ли я в конце?
{-# LANGUAGE QuasiQuotes #-}
import Text.Blaze.Html.Renderer.String (renderHtml)
import Text.Hamlet (hamlet)
main = do
let xs = [1 :: Int, 2, 3]
putStrLn $ renderHtml $ [hamlet|
$forall x <- xs
$if x == 1
ONE,
$else
#{x},
|] ()
Это производит ONE,2,3,
, Я нуждаюсь ONE,2,3
, Для любого произвольного списка, конечно. Пожалуйста помоги.
2 ответа
Решение
Ты можешь использовать intersperse
функция:
{-# LANGUAGE QuasiQuotes #-}
import Text.Blaze.Html.Renderer.String (renderHtml)
import Text.Hamlet (hamlet)
import Data.List (intersperse)
main = do
let xs = intersperse "," $ map show [1 :: Int, 2, 3]
putStrLn $ renderHtml $ [hamlet|
$forall x <- xs
$if x == "1"
ONE
$else
#{x}
|] ()
Это будет производить это:
ONE,2,3
Обратите внимание, что intersperse
вставит промежуточный ,
между вашим списком. Итак, в квазиквотере Гамлета вы просто отображаете список:
λ> intersperse "," $ map show [1,2,3]
["1",",","2",",","3"]
Я думаю, что вы должны реализовать такую логику на стороне Haskell, например:
import Data.List (intercalate)
main = do
let xs = [1 :: Int, 2, 3 ]
str = intercalate "," $ map fmt xs
fmt 1 = "ONE"
fmt x = show x
... [hamlet| #{str}] ...
Некоторые визуальные эффекты, которые обрабатывают первый или последний элемент последовательности особым образом, также могут быть реализованы с использованием CSS, то есть с использованием <ul>
а также <li>
теги.