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不过,出于历史或教学原因,或者仅仅是为了方便起见,您可能仍希望保留名称.
这是所有与发生Reader和ReaderT-你并不需要这些别名,但他们可以方便,并有助于提高代码的清晰度.