[Fwd: Re: type class VS struct/functor]

Ashley Yakeley ashley@semantic.org
Sat, 19 Jan 2002 15:33:22 -0800


At 2002-01-18 18:59, Ahn Ki-yung wrote:

>Each of these Set types takes a string, but the membership test is
>different. This is an annoying case in Haskell, because you can make a
>String a member of the Eq typeclass in only one way.

Your example seemed to translate into Haskell quite straightforwardly...

module FunctorTest where
    {
    import Char;
    lowercase = fmap toLower;
    
    data EQ' t = EQ'
        {
        eq :: t -> t -> Bool
        };
    
    data SET elt set = SET
        {
        empty :: set,
        add :: elt -> set -> set,
        mem :: elt -> set -> Bool
        };
    
    fSet :: EQ' t -> SET t [t];
    fSet mEq = SET
        {
        empty = [],
        add = \elt set -> elt:set,
        mem = let
            {
            mm elt [] = False;
            mm elt (x:xs) = if eq mEq x elt then True else mm elt xs;
            } in mm
        };
    
    sensitiveCase :: EQ' String;
    sensitiveCase = EQ'
        {
        eq = \s s' -> s == s'
        };
    
    insensitiveCase :: EQ' String;
    insensitiveCase = EQ'
        {
        eq = \s s' -> (lowercase s) == (lowercase s')
        };
    
    sensitiveSet = fSet(sensitiveCase);   
    insensitiveSet = fSet(insensitiveCase);
    }


-- 
Ashley Yakeley, Seattle WA