Отдельные элементы списка вывода по разделителю в хамлете

Если у меня есть код ниже, как мне избавиться от последней запятой в выводе? Есть ли способ узнать, где я в цикле и нахожусь ли я в конце?

{-# 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> теги.

Другие вопросы по тегам