[Haskell-cafe] Re: Interesting new user perspective

apfelmus apfelmus at quantentunnel.de
Tue Oct 14 05:51:48 EDT 2008


Ryan Ingram wrote:
> Normally I agree with you, apfelmus, but here at least I have to differ!

/me considers  map crushToPurée . filter disagrees  ;)

> On Mon, Oct 13, 2008 at 11:50 AM, apfelmus <apfelmus at quantentunnel.de> wrote:
>>  *HTML> toString $ tag "b" [] [tag "i" [] [text "<>"], text "test"]
>>  "<b><i>&lt;&gt;</i>test</b>"
> 
> I'd say the big problem is that your embedded language for describing
> HTML is way more complex for a domain expert than
> 
> doc = renderHTML $(q "<b><i>#{v1}</i>#{v2}</b>")
>    where
>        v1 = "<>"
>        v2 = "test"
>
> which, while somewhat error-prone in the HTML string itself, is much
> more likely to get used than an embedded language.  One thing that
> "ideal in theory" solutions seem to miss out on a lot is usability;

Ok, syntactic considerations.

Why again would I want to bother memorizing HTML syntax?

I know the Haskell syntax, in particular the space for function
application and lowercase identifiers for variables. I care little about
the myriad of other notations for function application and variables
that people have invented, for that's - in a sense - what all languages
boil down to. How is remembering more arcane syntax more usable?

Also, by embedding instead of "enshrining" a DSL like HTML in the host
language, I get all the flexibility of the host language.

  node :: String -> [Attr] -> [Html] -> Html  -- renamed from last time
  text :: String -> Html

  tag  x = node x []

  bold   = tag "b"
  italic = tag "i"
  olist  = tag "ol" . map (tag "li")
  table  = tag "table" . map (tag "tr" . map (tag "td"))

  example = bold [italic $ text "<>", text "test"]

  dialogue = tag "dl" . map (\(speaker,talk) ->
                 [tag "dt" [italic $ text (speaker ++ ":")]
                 ,tag "dd" talk])

In a sense, I can define my own tags.


Regards,
apfelmus



More information about the Haskell-Cafe mailing list