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

2008-06-03 Thread apfelmus

Darrin Thompson wrote:

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
extensions?

The idea was to take a remotely Dom-like tree and flatten it into a
string, but not require any particular string type.

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

instance (Monoid s, IsString s) = HTML (Attr s) s where


The H98 way is to make a class for type constructors:

  class HTML d where
toHTML :: (Monoid s, IsString s) = d s - s

  instance HTML Dom where ...

  instance HTML Attr where ...


Btw, naming the class HTML is feels wrong, something like Serialize is 
probably a better fit.



Regards,
apfelmus

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


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

2008-06-03 Thread Sterling Clover
This was how it was originally done in HStringTemplate, as I recall.  
The mptcs were introduced in order to maintain lookup-maps of the  
correct type, and particularly to allow embedding of templates within  
one another. There may have been some other corner-cases involved as  
well. However, unless you run into them, the H98 way is certainly  
cleaner.


--Sterl

On Jun 3, 2008, at 1:17 PM, apfelmus wrote:


Darrin Thompson wrote:

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
extensions?
The idea was to take a remotely Dom-like tree and flatten it into a
string, but not require any particular string type.
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
instance (Monoid s, IsString s) = HTML (Attr s) s where


The H98 way is to make a class for type constructors:

  class HTML d where
toHTML :: (Monoid s, IsString s) = d s - s

  instance HTML Dom where ...

  instance HTML Attr where ...


Btw, naming the class HTML is feels wrong, something like  
Serialize is probably a better fit.



Regards,
apfelmus

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe