2

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

 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] 是什么意思?

谢谢!

4

1 回答 1

5

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

第 3 行和第 4 行使用lr变量的投影并执行map. leftandright方法返回投影。如果您leftLeft变量进行投影,则可以在map内部值上进行投影。如果您rightLeft变量进行投影,Right即使在map. 如果你right在 aLeft等上做同样的事情。

所以第 3 行,因为l是 aLeft并且你left投影它,所以你应用给你mapLeft("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)and 类型Right[_, Int],它是子类Either[Int, Int],所以它是有效的。它只是为了展示我相信的类型。

如果你去 REPL 并输入类似的东西val foo = Right(1234),你会得到一个类型Right[Nothing, Int]- 这“有效”,因为该Nothing类型是所有类型的子类。

On a related note, once you start feeling comfortable with that and/or Scala, I recommend checkout Scalaz (a library for Scala that provides functional programming things like type classes, monads, and all that good stuff) and the Validation class which is pretty similar to Either.

于 2012-09-20T01:42:13.947 回答