Joe Fredette wrote:
I fiddled with my previous idea -- the NatTrans class -- a bit, the results
are here[1], I don't know enough really to know if I got the NT law right, or
even if the class defn is right.

Any thoughts? Am I doing this right/wrong/inbetween? Is there any use for a class like this? I listed a couple ideas of use-cases in the paste, but I have no idea of
the applicability of either of them.

/Joe

http://hpaste.org/fastcgi/hpaste.fcgi/view?id=10679#a10679

A few problems there:

(1) The |a| should be natural, i.e. universally qualified in the class methods, not an argument of the typeclass.

(2) Just because there's a natural transformation from F to G does not mean there's a "related" natural transformation back. The law you want is,

    forall (X :: *) (Y :: *) (f :: X -> Y).
        eta_Y . fmap_F f == fmap_G f . eta_X

(3) There can be more than one natural transformation between two functors. Which means a type class is the wrong way to go about things since there can only be one for the set of type parameters. Consider for instance:

    type F a = [a]
    type G a = [a]

    identity :: F a -> G a
    identity []     = []
    identity (x:xs) = (x:xs)

    reverse :: F a -> G a
    reverse = go []
        where
        go ys []     = ys
        go ys (x:xs) = go (x:ys) xs

    nil :: F a -> G a
    nil = const []

    ...

--
Live well,
~wren
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to