在Scalaz中,Kleisli,ReaderT和Reader是否相同只是巧合

Mic*_*ael 16 scala scalaz kleisli reader-monad

在斯卡拉兹

  • Kleisli[F, A, B]是一个包装A => F[B].
  • ReaderT[F, A, B]- 读者monad变换器 - 只是别名Kleisli[F, A, B].
  • Reader[A, B]monad是ReaderT身份monad 的专长Id:
    type Reader[A, B] = ReaderT[Id, A, B].

难道仅仅是巧合还是有一些更深层次的原因Kleisli,ReaderT以及Reader是同构的Scalaz?

Tra*_*own 23

您可以将其视为通过两条不同的路线到达同一个地方.一方面,你从阅读器monad开始,它只是一种函数包装器.然后你意识到你想要将这个阅读器功能集成到一个带有其他"效果"的更大的monad中,所以你创建了一个ReaderTmonad变换器.那时将原作实现Reader[E, ?]ReaderT[Id, E, ?].

另一方面,您需要一个类型来表示Kleisli箭头(即具有monadic返回类型的函数).事实证明,这是一样的ReaderT,所以你只需要把它作为别名.

关于"结果"部分,没有什么可怕的神秘感.这有点像你开始使用Addable类型类的类型类,然后决定使它更通用,并最终得到一个类型类,只提供一个关联的"类似添加"操作.你彻底改造了Semigroup!Addable不过,出于历史或教学原因,或者仅仅是为了方便起见,您可能仍希望保留名称.

这是所有与发生ReaderReaderT-你并不需要这些别名,但他们可以方便,并有助于提高代码的清晰度.

  • 你可以找到Travis在这里解释的例子:http://eed3si9n.com/learning-scalaz/Composing+monadic+functions.html (2认同)