为什么没有else块会转换为函数的单元类型返回?

问题描述 投票:-2回答:2

我注意到在else if(r1 == 0 || divisors.tail.isEmpty || !divisors.tail.contains(r1)){newAcc}行中导致类型不匹配。因为我的else]没有if ... else if ...子句

def euclidianDivision(dividend:Int,divisor:Int):(Int,Int)={
  val quotient = dividend/divisor
  val remainder = dividend%divisor

  (quotient,remainder)
}
def firstExpansion(dividend:Int,divisors:List[Int]):List[(Int,Int)]={
  def firstExpansionIter(dividend:Int,divisors:List[Int], acc:List[(Int,Int)]):List[(Int,Int)]= {
    val div1:Int = divisors.head
    val (q1,r1):(Int,Int) = euclidianDivision(dividend,div1)
    val newAcc:List[(Int,Int)] = acc:::List((div1,q1))
    if (divisors.tail.contains(r1)){
      firstExpansionIter(r1,divisors.tail,newAcc)
    }else if(r1 == 0 || divisors.tail.isEmpty || !divisors.tail.contains(r1)){newAcc}
  }
  firstExpansionIter(dividend,divisors,List((0,0))).tail
}

这里是错误代码:

错误:(32,15)类型不匹配;找到:所需单位:列表[(Int,Int)]}其他if(r1 == 0 || divisors.tail.isEmpty ||!divisors.tail.contains(r1)){newAcc}

我可以通过添加else子句来纠正此问题,但是如果默认情况下未处理任何结果,该函数将尝试返回Unit怎么办?

NB:更正后的代码:

def firstExpansion(dividend:Int,divisors:List[Int]):List[(Int,Int)]={
  def firstExpansionIter(dividend:Int,divisors:List[Int], acc:List[(Int,Int)]):List[(Int,Int)]= {
    val div1:Int = divisors.head
    val (q1,r1):(Int,Int) = euclidianDivision(dividend,div1)
    val newAcc:List[(Int,Int)] = acc:::List((div1,q1))
    if (divisors.tail.contains(r1)){
      firstExpansionIter(r1,divisors.tail,newAcc)
    }else if(r1 == 0 || divisors.tail.isEmpty || !divisors.tail.contains(r1)){newAcc}
    else throw new RuntimeException("Something unexpected happened.")
  }
  firstExpansionIter(dividend,divisors,List((0,0))).tail
}

我注意到在该行中存在类型不匹配,否则if(r1 == 0 || divisors.tail.isEmpty ||!divisors.tail.contains(r1)){newAcc}。因为我的if ... else if ... def ...

scala recursion functional-programming tail-recursion
2个回答
0
投票

通过@JörgWMittag:


0
投票

我可以通过添加else子句来纠正此问题,但是如果默认情况下未处理任何结果,该函数将尝试返回Unit怎么办?

© www.soinside.com 2019 - 2024. All rights reserved.