4

This is a followup to my old questions:

I know that monads are not composable, i.e. if M1[_] and M2[_] are monads M2[M1[_]] is not necessarily a monad. For instance, List[Int] and Option[Int] are monads but Option[List[Int]] is not automatically a monad and therefore I need a monad transformer to use it as a monad (as in here)

I know that applicative functors are composable. I guess it means that if A1[_] and A2[_] are applicatives then A2[A1[_]] is always an applicative. Is it correct ?

Could you provide an example of such a composition when A1 is List and A2 is Option ? Could you give an example of other applicatives composed ?

Community
  • 1
  • 1
Michael
  • 41,026
  • 70
  • 193
  • 341

1 Answers1

1

I added some examples to the scalaz source a while back which are relevant. I added examples of using composed Apply instances (Apply is Applicative without the point method):

https://github.com/scalaz/scalaz/blob/series/7.2.x/example/src/main/scala/scalaz/example/ApplyUsage.scala#L132-L147

but yes, for any M1[_] for which we have Applicative[M1] and M2[_] for which we have Applicative[M2], M1[M2[_]] is applicative, and you can get the Applicative instance with Applicative[M1] compose Applicative[M2]

stew
  • 11,276
  • 36
  • 49