Given:
import Lucid
import Lucid.Base
mainPage :: Html ()
mainPage = div_ (p_ "hello")
I get the following compile-time error:
/Users/kevinmeredith/Workspace/my-project/src/Lib.hs:9:18: error:
• Couldn't match type ‘HtmlT Data.Functor.Identity.Identity ()’
with ‘[Char]’
arising from a functional dependency between:
constraint ‘Term [Char] (HtmlT Data.Functor.Identity.Identity ())’
arising from a use of ‘p_’
instance ‘Term (HtmlT m a) (HtmlT m a)’ at <no location info>
• In the first argument of ‘div_’, namely ‘(p_ "hello")’
In the expression: div_ (p_ "hello")
In an equation for ‘mainPage’: mainPage = div_ (p_ "hello")
How can I fix this compile-time error please?
As is written in the documentation:
So you need to turn on the
OverloadedStringsandExtendedDefaultRulesextensions.You can do this by compiling with:
But perhaps more convenient is to turn the extensions on in the header of the file:
Like the compiler says in the error message,
p_anddiv_do not expectStrings, but aHtmlT Data.Functor.Identity.Identity ()type (some sort of string). This type is however a member of theIsStringtypeclass, so it can be seen as "string-like" types, and has an implementation [source code]:The reason this happens is because you can add HTML characters, in which case
(p_ "<foo>")would look like:<p><foo></p>. But this is quite unsafe. By first processing it throughtoHtml, the result will be<p><foo></p>.