17

在斯卡拉兹

  • Kleisli[F, A, B]A => F[B].
  • ReaderT[F, A, B]-- reader monad transformer -- 只是Kleisli[F, A, B].
  • Reader[A, B]monad 是ReaderTwith identity monad的一个特化Id
    type Reader[A, B] = ReaderT[Id, A, B].

这只是巧合还是有一些更深层次的原因在 ScalazKleisli中是ReaderTReader构的?

4

1 回答 1

24

你可以把它想象成通过两条不同的路线到达同一个地方。一方面,您从 reader monad 开始,它只是函数的一种包装器。然后您意识到您想将此阅读器功能集成到具有其他“效果”的更大的 monad 中,因此您创建了一个ReaderTmonad 转换器。在这一点上,将您的原始文件实现Reader[E, ?]ReaderT[Id, E, ?].

另一方面,您需要一种类型来表示 Kleisli 箭头(即具有一元返回类型的函数)。事实证明,这与 是一回事ReaderT,因此您只需将其设为别名。

“事实证明”部分并没有什么特别神秘的地方。这有点像,如果您从一个Addable类型类开始用于类似数字的事物,然后决定使其更通用,并最终得到一个仅提供关联的“类似加法”操作的类型类。你重新发明了SemigroupAddable不过,出于历史或教学原因,或者只是为了方便,您可能仍希望保留该名称。

这就是所发生的一切,Reader并且ReaderT- 您不需要这些别名,但它们很方便,并且可能有助于提高代码的清晰度。

于 2015-03-24T15:54:57.393 回答