gpt4 book ai didi

斯卡拉代码片段

转载 作者:行者123 更新时间:2023-12-02 05:30:06 25 4
gpt4 key购买 nike

我是 Scala 的新手。任何人都可以向我解释以下代码吗?

 val l: Either[String, Int] = Left("flower")
val r: Either[String, Int] = Right(12)
l.left.map(_.size): Either[Int, Int] // Left(6)
r.left.map(_.size): Either[Int, Int] // Right(12)

我有几个关于第 3 行和第 4 行的问题:

  1. _.size 在上下文中代表什么?
  2. r.left 返回什么?
  3. r.left.map 返回什么?
  4. r.left.map(_.size): Either[Int, Int] 是什么意思?

谢谢!

最佳答案

第一行定义了一个类型为 l 的变量 Either[String, Int]Either(抽象)类用于表示什么时候可以持有两个可能值之一。 LeftRight 类是 Either 的子类,因此是有效的分配。惯例是使用 Left 表示某种失败(例如 String 描述出了什么问题),而 Right 表示某种成功的计算/值。有了这些信息,第二行也很容易解释。

第 3 行和第 4 行使用 lr 变量的投影并执行 mapleftright 方法返回投影。如果您将 left 投影到 Left 变量上,则可以将 map 加到内部值上。如果将 right 转换到 Left 变量上,即使在 Right 之后,您也会得到 map 未更改的值。如果你在 right 上执行 Left 等也是一样。

所以第 3 行,因为 lLeft 而你用 left 投影它,你将 map 应用到 Left("flower") 值上得到 Left(6),因为“花”的长度为 6。

在第 4 行,rRight,所以它什么都不做。

对于您的问题:

  1. _.size 是传递给 map 方法的函数。map 方法“解压缩”Left 中的值(它对第 4 行的 Right 没有任何作用,因为它是左投影)并在其上调用 .size

  2. r.left 返回 Right(12) 值的左投影。如您代码的第 4 行所示,对此进行映射不会执行任何操作。

  3. 相同的旧 Right(12) 值。

  4. 因为它是 Right(12) 并且类型是 Right[_, Int] ,所以它是 Either[Int, Int] 的子类,所以它是有效的。它只是在那里显示我相信的类型。

如果您转到 REPL 并键入类似 val foo = Right(1234) 的内容,您将得到一个类型 Right[Nothing, Int] - 这“有效”,因为 Nothing 类型是所有类型的子类。

相关说明,一旦您开始对它和/或 Scala 感到满意,我建议您检查 Scalaz(一个 Scala 库,提供函数式编程,例如类型类、monad 和所有这些好东西)和 Validation 类这与 Either 非常相似。

关于斯卡拉代码片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12504746/

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