Scala 中的应用组合示例

Example of Applicative composition in Scala

这是我的旧 questions 的后续:

我知道 monad 不可组合,即如果 M1[_]M2[_] 是 monad M2[M1[_]] 不一定是 monad。例如,List[Int]Option[Int] 是单子,但 Option[List[Int]] 不是 自动 单子,因此我需要一个 monad transformer 来使用它作为 monad(如 here

我知道应用函子是可组合的。我想这意味着如果 A1[_]A2[_] 是应用程序,那么 A2[A1[_]]always 一个应用程序。这是对的吗 ?

A1List 并且 A2Option 时,你能提供这样一个组合的例子吗?你能举一个其他应用程序组成的例子吗?

我不久前在 scalaz 源代码中添加了一些相关的示例。我添加了使用组合 Apply 实例的示例(没有 point 方法的 Apply 是 Applicative):

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

但是是的,对于我们有 Applicative[M1] 的任何 M1[_] 和我们有 Applicative[M2]M2[_]M1[M2[_]] 是适用的,你可以通过 Applicative[M1] compose Applicative[M2]

获取 Applicative 实例