2015-07-19 9 views
4

Я пытался переписать:Не может пересекаться "", а 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 где просто заменяют друг друга?

Edit: В конце концов, я хотел бы выяснить способ использовать unwords ... Выяснить, почему это дает мне ошибку и как я могу работать вокруг него есть цель! =)

+3

Они бывают разных типов. 'mconcat. interperse "" 'вместе являются' unwords'. –

+0

@ н.м. Или просто 'concat. Intersperse "" ' – AJFarmar

ответ

8

unwords :: [String] -> String функция работает только в списках String с. У вас есть список значений типа MarkupM().

Причина, по которой intersperse :: a -> [a] -> [a] работ заключается в том, что она работает со списком на любом типе. С OverloadedStrings pragma значение " " имеет тип 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, например.

2

У вас будет работа, если вы используете 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 
+0

Я использую' {- # LANGUAGE OverloadedStrings # -} ', и я все еще не могу использовать unwords. Я имею в виду, что он работает нормально, используя 'intersperse '", но я чувствую, что должен быть способ записать его иначе. – Berkson