scala代码段
我是斯卡拉的新手。谁能给我解释一下下面的代码scala代码段,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行,我有几个问题: 在上下文中,大小代表什么 r.left返回什么
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行,我有几个问题:
谢谢 第一行定义了类型为
的变量l
,[String,Int]
。或
(抽象)类用于表示某个对象何时可以包含两个可能值中的一个。左
和右
类的子类或者
,因此是有效的赋值。一种惯例是使用Left
表示某种类型的故障(例如,描述出错原因的String
),使用Right
表示某种类型的成功计算/值。有了这些信息,第二行也是不言自明的
第三行和第四行使用l
和r
变量上的投影,并执行映射。left
和right
方法返回投影。。如果在left
变量上投影left
,则可以map
内部值。如果在Left
变量上投影right
,则即使在映射之后,right
也不会改变。如果在<代码>左侧<代码>上执行<代码>右侧<代码>等操作,则相同
所以第三行,因为l
是一个Left
并且你Left
投影它,你在Left(“flower”)
上应用映射,给你Left(6)
,因为“flower”的长度是6
在第四行,r
是Right
,所以它什么也不做
关于您的问题:
。
是传递给map
方法的函数。。map
方法将左侧
中的值“解包”(第4行的右侧
不做任何操作,因为它是一个左侧投影),并在其上调用.size
r.left
返回右侧(12)
值的左侧投影。如代码第4行所示,映射到这一点没有任何作用
相同的旧右(12)
值
由于它是Right(12)
,并且类型为Right[\uu,Int]
,因此它是的子类[Int,Int]
,因此它是有效的。它只是为了展示我相信的类型
如果您转到REPL并键入类似于val foo=Right(1234)
,您会得到一个类型Right[Nothing,Int]
-这个“工作”是因为Nothing
类型将所有类型子类化
另一方面,一旦您开始对它和/或Scala感到满意,我建议您签出Scalaz(Scala的一个库,它提供函数式编程功能,如类型类、monad和所有这些好东西)和与或非常相似的验证类