[Haskell-beginners] Extend instance for List
Graham Gill
math.simplex at gmail.com
Mon Dec 14 04:57:27 UTC 2015
The NICTA course <https://github.com/NICTA/course> includes exercises on
the type class Extend, in Course/Extend.hs. Extend is a superclass of
Comonad. Here's the class definition:
> -- | All instances of the `Extend` type-class must satisfy one law.
> This law
> -- is not checked by the compiler. This law is given as:
> --
> -- * The law of associativity
> -- `∀f g. (f <<=) . (g <<=) ≅ (<<=) (f . (g <<=))`
> class Functor f => Extend f where
> -- Pronounced, extend.
> (<<=) ::
> (f a -> b)
> -> f a
> -> f b
>
> infixr 1 <<=
Could someone please motivate the Extend instance for List? (Its
implementation is left as an exercise. In the course, type List a is
isomorphic to [a].) Some of the tests (<<=) is expected to pass are
shown, and make clear what ought to happen.
> -- | Implement the @Extend@ instance for @List at .
> --
> -- >>> length <<= ('a' :. 'b' :. 'c' :. Nil)
> -- [3,2,1]
> --
> -- >>> id <<= (1 :. 2 :. 3 :. 4 :. Nil)
> -- [[1,2,3,4],[2,3,4],[3,4],[4]]
> --
> -- >>> reverse <<= ((1 :. 2 :. 3 :. Nil) :. (4 :. 5 :. 6 :. Nil) :. Nil)
> -- [[[4,5,6],[1,2,3]],[[4,5,6]]]
The following (wrong, according to the tests) Extend instance for List
nevertheless obeys the types and obeys the Extend law of associativity.
> instance Extend List where
> (<<=) ::
> (List a -> b)
> -> List a
> -> List b
> (<<=) f = (:. Nil) . f
(:. Nil) is analogous to (: []), create a singleton list.
I can't find a good reference on the Extend type class to convince me
why the correct Extend instance for List in the course is the desirable
one. (I'm not saying my version is desirable, in fact it seems fairly
useless, but it works.)
Graham
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/beginners/attachments/20151213/85064018/attachment.html>
More information about the Beginners
mailing list