gpt4 book ai didi

scala - Scala : return, 本地的 Reader monad 和序列

转载 作者:行者123 更新时间:2023-12-02 00:13:15 25 4
gpt4 key购买 nike

我正在 Scala 中使用 scalaz 提供的 Reader monad图书馆。我熟悉这个单子(monad) as defined in Haskell 。问题是我找不到与 returnlocalsequence (以及其他)等效的函数。

目前我使用的结构是我不喜欢的,因为我在重复自己或者让我的代码有点晦涩。

关于return,我目前正在使用:

Reader{_ => someValue}

我宁愿只使用像 unit(someValue) 这样的构造,但我在互联网上找不到任何东西。有像this one这样的教程使用上述方法,我认为这不是最佳方法。

关于 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]]

看起来相当晦涩难懂,看起来就像黑魔法。理想情况下,我想在 Monad 上使用 sequence 操作。

scalaz 或类似库上是否有更好的将这些结构翻译为 Scala 的方法?我没有与任何 Scala 函数库结合,因此任何使用其他库的解决方案都可以,尽管我宁愿使用 scalaz 得到答案,因为我已经使用它实现了我的代码。

最佳答案

为了让事情变得简单,我填写了一些类型。将它们更改为具有泛型类型的 def 应该仍然有效。我还提取了 ReaderInt类型,以避免与类型 lambda 混淆。

返回/纯/点

Scala 没有自动类型类解析,因此您需要隐式提供它们。对于 Kleisli (作为读者的 monad 转换器), Kleisli[Id, ?, ?]就够了

 implicit val KA = scalaz.Kleisli.kleisliIdApplicative[Int]
type ReaderInt[A] = Kleisli[Id.Id, Int, A]

val alwaysHello = KA.point("hello")

或使用导入的语法:

  import scalaz.syntax.applicative._  
val alwaysHello = "hello".point[ReaderInt]

因此,作为一般规则,您

1)导入应用实例,通常位于scalaz.std.something.somethingInstance

2) import scalaz.syntax.something._

3)然后你可以写x.point[F] ,其中F是你的应用程序。

本地

不确定它是否回答了您的问题,但是 Kleisli有一个local方法。

val f: String ⇒ Int = _.length
val alwaysEleven = alwaysHello local f

测序

同样的,您可以自由选择使用syntax for 或 显式指定类型类。

  import scalaz.std.list.listInstance
val initial: List[ReaderInt[String]] = ???
val sequenced: ReaderInt[List[String]] = Traverse[List].sequence[ReaderInt, String](initial)

import scalaz.syntax.traverse._
val z = x.sequence[ReaderInt, String]

我不想使用sequenceU ,它使用 Unapply typelcas 来推断 G类型,因为有时 scala 很难找出正确的类型。而且我个人并不觉得自己输入某些类型很困惑。

可能值得研究一下 cats ,尽管还没有太多。

关于scala - Scala : return, 本地的 Reader monad 和序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38524384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com