Разве нельзя использовать вкрапления " " и unwords как замену друг другу?
Я пытался переписать:
return $ renderHtml $ mconcat $ intersperse " " $ catMaybes links
Который работает просто отлично, в:
return $ renderHtml $ mconcat $ unwords $ catMaybes links
но возвращается
Couldn't match type ‘Char’
with ‘blaze-markup-0.7.0.2:Text.Blaze.Internal.MarkupM ()’
Expected type: H.Html
Actual type: Char
In the second argument of ‘($)’, namely
‘mconcat $ unwords $ catMaybes links’
In the second argument of ‘($)’, namely
‘renderHtml $ mconcat $ unwords $ catMaybes links’
In a stmt of a 'do' block:
return $ renderHtml $ mconcat $ unwords $ catMaybes links
Я еще не лучший с Haskell, но я подумал intersperse " "
а также unwords
где просто замените замены друг на друга?
Редактировать: в конечном счете, я хотел бы выяснить, как использовать unwords
... Выяснить, почему это дает мне ошибку, и как я могу ее обойти, является целью! знак равно
2 ответа
unwords :: [String] -> String
функция работает только в списках String
s. Что у вас есть список значений типа MarkupM ()
,
Причина по которой intersperse :: a -> [a] -> [a]
работает то, что работает список любого типа. С OverloadedStrings
Прагма " "
значение имеет тип MarkupM
(потому что этот тип имеет экземпляр для IsString
). intersperse
Функция берет список этих значений разметки и помещает пробелы между ними, но все равно возвращает список значений разметки. в заключение mconcat
объединяет список в одно значение, по-прежнему типа MarkupM ()
, С помощью некоторого конструктора псевдоданных вы можете представить значения, подобные этим:
[Markup "foo", Markup "bar", Markup "baz"] -- returned by catMaybes links
[Markup "foo", Markup " ", Markup "bar", Markup " ", Markup "baz"] -- after intersperse
Markup "foo bar baz" -- after mconcat
Там нет простого способа получить unwords
работать в этом случае, поскольку у вас нет строк, и преобразование в строки потеряло бы вас некоторые преимущества. Инкапсуляция разметки в соответствующую оболочку гарантирует, что вы не создадите, например, плохо сформированный HTML.
Что у вас будет работать, если вы используете LANGUAGE OverloadedStrings
,
В противном случае используйте intersperse (text " ")
вместо intersperse " "
,
Например:
{-# LANGUAGE OverloadedStrings #-}
import Text.Blaze.Html
import Text.Blaze.Renderer.String
import Data.Maybe
import Data.List
import Data.Monoid
foo links = renderHtml $ mconcat $ intersperse " " $ catMaybes links