
On 20 Nov 2015, at 11:31, Erik Hesselink
wrote: On 20 November 2015 at 02:30, Manuel Gómez
wrote: I haven’t found a helpful example of an Applicative that is not a Monad that is practical for a lesson.
There's ZipList [0], which depending on the type of audience might be doable. There's also Const [1], but that needs a Monoid constraint, and since you said you considered ((,) e) as not having an Applicative, which it does have with a Monoid constraint, perhaps Const isn't suitable to you for that reason. There are more interesting examples here [2].
Erik
[0] https://hackage.haskell.org/package/base-4.8.1.0/docs/Control-Applicative.ht... [1] http://hackage.haskell.org/package/base-4.8.1.0/docs/Control-Applicative.htm... [2] http://stackoverflow.com/questions/7220436/good-examples-of-not-a-functor-fu... _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
There are also (which I find actually useful): - `Concurrently = Concurrently (IO a)` which is Monad only IO effects are commutative. [3] - one can argue that Applicative and Monad instances aren’t compatible - `Errors` [4], which could be specialised to `Either (NonEmpty err) a` and `ap` would gather all errors! - and of course `Lift` using which `Errors` is defined. [3] https://hackage.haskell.org/package/async-2.0.2/docs/Control-Concurrent-Asyn... https://hackage.haskell.org/package/async-2.0.2/docs/Control-Concurrent-Asyn... [4] https://hackage.haskell.org/package/transformers-0.4.3.0/docs/Control-Applic... https://hackage.haskell.org/package/transformers-0.4.3.0/docs/Control-Applic... - Oleg