[Haskell-cafe] Rewrite class with fundeps in pure h98?

Darrin Thompson darrinth at gmail.com
Tue Jun 3 11:53:07 EDT 2008

I thought that I should be able to write something like the toHtml
function below with pure H98, but when I went to write it I ended up
needing fundeps. Is there a way to express this without using any

The idea was to take a remotely Dom-like tree and flatten it into a
string, but not require any particular string type. Mostly I'm ripping
off HStringTemplate for the fun of it.

{-# OPTIONS -fglasgow-exts #-}
module Control.WebWidget where

import Data.Monoid
import Data.String

data (IsString s, Monoid s) => Dom s =
    Element s [Attr s] [Dom s] |
    Text s

data (IsString s, Monoid s) => Attr s = Attr s s

class (Monoid s, IsString s) => HTML d s | d -> s where
    toHtml :: d -> s

instance (Monoid s, IsString s) => HTML (Dom s) s where
    toHtml (Element name attrs children) =
        mconcat [
            fromString "<",
            mconcat $ map toHtml attrs,
            fromString ">",
            mconcat $ map toHtml children,
            fromString "</",
            fromString ">" ]
    toHtml (Text s) = s

instance (Monoid s, IsString s) => HTML (Attr s) s where
    toHtml (Attr key value) =
        mconcat [
            fromString " '",
            fromString "'='",
            fromString "' " ]


More information about the Haskell-Cafe mailing list