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行,我有几个问题:

  • 在上下文中,大小代表什么
  • r.left返回什么
  • r.left.map返回什么
  • r.left.map(u.size)是什么意思?[Int,Int]是什么意思

  • 谢谢

    第一行定义了类型为
    的变量
    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和所有这些好东西)和与
    非常相似的
    验证