scala代码段

时间:2012-09-20 00:42:17

标签: scala

我是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):[Int,Int]是什么意思?
  5. 谢谢!

1 个答案:

答案 0 :(得分:5)

第一行定义类型为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")值给你{ {1}}因为“花”的长度为6。

在第4行,Left(6)r,因此无效。

对于你的问题:

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

  2. .size会在r.left值上返回左侧投影。对此进行映射无效,如代码第4行所示。

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

  4. 由于它是Right(12)且类型为Right(12),因此它是Right[_, Int]的子类,因此它是有效的。它只是显示我相信的类型。

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

    在相关的说明中,一旦你开始对这个和/或Scala感到满意,我建议结帐Scalaz(一个Scala库,提供类型类,monad和所有好东西等函数式编程)和{{ 1}}类与Nothing非常相似。