我Reader
在 Scala 中使用由scalaz库提供的 monad。我熟悉Haskell 中定义的这个 monad 。问题是我找不到等效于return
、local
和sequence
(以及其他)的函数。
目前我使用我不喜欢的构造,因为我在重复自己或使我的代码有点晦涩。
关于return
,我目前正在使用:
Reader{_ => someValue}
我宁愿只使用类似的构造unit(someValue)
,但我在互联网上找不到任何东西。有像这样的教程使用上述方法,我认为这不是最佳的。
关于local
我也必须做类似的事情:而不是输入类似的东西:local f myReader
我必须展开它的定义:
Reader{env => myReader.run(f(env))
最后,序列有点接近我的预期(作为一个使用 Scala 的 Haskell 难民):
readers: List[Reader[Env, T]]
readerTs: Reader[Env, List[T]] = readers.sequenceU
我对这个实现的问题是,对于 Scala 来说相对较新,sequenceU
final class TraverseOps[F[_],A] private[syntax](val self: F[A])(implicit val F: Traverse[F]) extends Ops[F[A]] {
//...
def sequenceU(implicit G: Unapply[Applicative, A]): G.M[F[G.A]]
看起来相当晦涩,似乎是黑魔法。理想情况下,我想sequence
在 Monads 上使用操作。
scalaz 或类似库上是否有将这些构造更好地转换为 Scala 的方法?我没有与 Scala 的任何函数库结婚,因此任何使用其他库的解决方案都可以,尽管我宁愿使用 scalaz 来回答,因为我已经使用它实现了我的代码。