第一行定义了一个l
类型为 的变量Either[String, Int]
。(Either
抽象)类用于表示某物何时可以保存两个可能值之一。和类 subclass Left
,因此是有效的分配。约定用于表示某种失败(例如,描述出了什么问题),并表示某种成功的计算/值。有了这些信息,第二行也很容易解释。Right
Either
Left
String
Right
第 3 行和第 4 行使用l
和r
变量的投影并执行map
. left
andright
方法返回投影。如果您left
对Left
变量进行投影,则可以在map
内部值上进行投影。如果您right
对Left
变量进行投影,Right
即使在map
. 如果你right
在 aLeft
等上做同样的事情。
所以第 3 行,因为l
是 aLeft
并且你left
投影它,所以你应用给你map
的Left("flower")
值,Left(6)
因为“花”的长度为 6。
在第 4 行,r
它Right
什么也不做。
对于您的问题:
_.size
是传递给该map
方法的函数。该map
方法“解包”内部的值Left
(它对第 4 行没有任何作用,Right
因为它是左投影)并调用.size
它。
r.left
返回值的左投影Right(12)
。如代码的第 4 行所示,对此进行映射没有任何作用。
相同的旧Right(12)
值。
由于它是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
.