【问题标题】:expression type of list[equals] does not conform to expected type seq[either[string,int]]list[equals] 的表达式类型不符合预期的类型 seq[either[string,int]]
【发布时间】:2018-03-02 03:35:40
【问题描述】:
def convert(list: List[String]): Seq[Either[String, Int]] = list match {
      case head :: Nil => Right(head.toInt) :: Nil;
      case head :: tail => Right(head.toInt) :: convert(tail) :: Nil;
}

print(convert(List("3", "4", "55")))

我需要其中一个的序列,但它会转换成一个列表[equlals],我不知道该怎么做。

【问题讨论】:

  • Left[String]有什么用?
  • 转换出错会在catch部分

标签: scala


【解决方案1】:

如果要将List[String] 转换为Seq[Either[String,Int]]

val input = List("1", "2", "testString")
//input: List[String] = List(1, 2, testString)

转化率:

import scala.util.Try
val output: Seq[Either[String,Int]] =
 input.map(ele => Try(Right(ele.toInt)).getOrElse(Left(ele))).toSeq
//output: Seq[Either[String,Int]] = List(Right(1), Right(2), Left(testString))

【讨论】:

    【解决方案2】:

    解决方案:

    def convert(list: List[String]): Seq[Either[String, Int]] = list match {
          case head :: Nil => Right(head.toInt) +: Seq.empty;
          case head :: tail => Right(head.toInt) +: convert(tail);
    }
    

    【讨论】:

    • 它不会在任何地方实例化任何Left。输入convert(List("42", "nope")) 会产生异常java.lang.NumberFormatException: For input string: "nope"
    • @AndreyTyukin 我知道,请阅读有关问题的 cmets,我回答了。
    【解决方案3】:

    我非常喜欢 Rumeshs 解决方案,但如果您更喜欢模式匹配样式:

    def convert (list: List [String]): List [Either [String, Int]] = list match {
        case Nil => Nil
        case head :: tail => if (head.matches ("[0-9]+"))
            Right (head.toInt) :: convert (tail) else
            Left (head) +: convert (tail)
    }
    
    convert (List("3", "four", "55"))
    // res304: List[scala.util.Either[String,Int]] = List(Right(3), Left(four), Right(55))
    
    convert (List("3", "4", "55"))
    // res305: List[scala.util.Either[String,Int]] = List(Right(3), Right(4), Right(55))
    

    最后转成Seq很简单

    convert (List("3", "4", "55")).toSeq
    

    或者使用你自己的方法 +: ,但是它会返回一个 List,因为 List 是一个 Seq,但它会错过失败的 .toInt 调用。

    我没有测试它 - 也许这个解决方案比 Try{} 方法更快,也可能更慢,可能取决于与 int 匹配失败的频率。

    Rumesh 指出,list.map 是同时工作的,所以这里是他的方法的字符串意义上的模式匹配:

    List("3", "four", "55") .map (ele => 
        if (ele.matches ("[0-9]+")) Right (ele.toInt) else (Left(ele))).toSeq
    // res307: scala.collection.immutable.Seq[Product with Serializable with scala.util.Either[String,Int]] = List(Right(3), Left(four), Right(55))
    
    List("3", "4", "55") .map (ele => 
        if (ele.matches ("[0-9]+")) Right (ele.toInt) else (Left(ele))).toSeq
    // res308: scala.collection.immutable.Seq[Product with Serializable with scala.util.Either[String,Int]] = List(Right(3), Right(4), Right(55))
    

    【讨论】:

    • 您的@tailrecursive 函数按顺序工作,如果您使用列表映射,它会同时转换每个元素。
    猜你喜欢
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 2018-05-21
    • 2017-07-09
    • 1970-01-01
    • 2018-10-27
    相关资源
    最近更新 更多