gpt4 book ai didi

Scala 的 Either 没有 `flatMap` 以及 Either.left/.right 的含义

转载 作者:行者123 更新时间:2023-12-02 06:04:14 26 4
gpt4 key购买 nike

查看 Haskell 的 Either Monad,有一个 >>= 函数。

Prelude Map> let add100 = \x -> Right (x+100 :: Int)

Prelude Map> x
Right 5
Prelude Map> x >>= add100
Right 105

Prelude Map> let y = Left "..." :: Either String Int
Prelude Map> y >>= add100
Left "..."

但是,为什么 Scala 的 Either[A,B] 没有 flatMap,即等价于 >>= 函数?

scala> e
res5: Either[String,Int] = Right(1)

scala> e.
asInstanceOf fold isInstanceOf isLeft isRight
joinLeft joinRight left right swap
toString

另外,是什么意思?

scala> e.left
res6: scala.util.Either.LeftProjection[String,Int] = LeftProjection(Right(1))

scala> e.right
res7: scala.util.Either.RightProjection[String,Int] = RightProjection(Right(1))

最佳答案

Either 不能有 flatMap,因为 Either 不是 monad。 Haskell 通过偏爱两种类型中的一种而不是另一种来将其变成单子(monad),但确实没有理由这样做。 Either 表示“这可以是两种类型之一”。时期。它不会对这两种类型中的任何一种给予任何优惠待遇。

如果您使用 Either 进行错误报告,那么您确实希望它偏向一侧,但这只是许多用例中的一个,并且将单个特殊用例硬编码为总体界面有糟糕设计的味道。对于该用例,您不妨使用 Try,这基本上是一个有偏见的 Either

leftright 返回 Either 的投影,该投影偏向一侧。 p>

但是,请注意,Either 的设计和可用性经常引起争论,而且它确实并不是良好 API 设计的 Shiny 灯塔。这就是 Try 和 ScalaZ \/ 存在的原因之一。

关于Scala 的 Either 没有 `flatMap` 以及 Either.left/.right 的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25467760/

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