Разве нельзя использовать вкрапления " " и 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 функция работает только в списках Strings. Что у вас есть список значений типа 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
Другие вопросы по тегам