函数定义中的“简单表达式的非法开头”

时间:2019-06-13 08:16:39

标签: scala

我完全没有使用Scala的经验。我已经得到了一些Scala的代码示例,以查看我是否可以理解代码的功能,并提出改进它的方法(胖机会)。尽管我可以看到代码中包含一些列表,随机数和case语句。

我试图通过在线Scala界面运行此命令,但不断出现错误“简单表达式的非法开头” 你们中任何一个好的Scala员工都可以看一下这段代码,也许可以给我一些提示。

试图在Scastie Online中运行此代码

import scala.util.Random

object ScalaApp {
 def main(args: Array[String]): Unit = {
   sayHello
   val randomList: List[Long] = generateList(20)
   printMaximumNumber(randomList)
   printMinimumNumber(randomList)
   println(Average(randomList))
 }

 private def sayHello: Unit = {
   Random.nextInt(5) match {
     case 0 => println("Hello, World!")
     case 1 => println("Hi!")
     case 2 => println("Good morning!")
     case 3 => println("Bye!")
     case 4 => println("Hello?")
     }
 }

 def tellAJoke(): Unit = {
   println("I, for one, like Roman numerals")
 }

 def generateList(n: Int): List[Int] = {
   Seq.fill(n)(Random.nextInt).toList
 }

 private def printMaximumNumber(randomList: List[Int]): Unit = {
   randomList.max
 }

 def printMinimumNumber(randomList: List[Int], acc: Option[Int] = None, i: Int = 0): Unit = {
   if (i < randomList.size)
     val temporaryMinimum = acc
     if (!acc.isDefined || randomList(i) < acc.get)
       temporaryMinimum = randomList(i)
     printMinimumNumber(randomList, Some(temporaryMinimum), i + 1)
   else
     println(s"Minimum: ${acc.getOrElse("???")}")
 }

 def Average(randomList: List[Int]): Int = {`enter code here`
   randomList.foldLeft(0)(_ + _) / randomList.size
 }
}

2 个答案:

答案 0 :(得分:1)

我通过进行以下更改来编译它。

val randomList: List[Int] = generateList(20)  //not List[Long]

...和...

def printMinimumNumber(randomList: List[Int], acc: Option[Int] = None, i: Int = 0): Unit = {
  if (!acc.isDefined || randomList(i) < acc.get)
    printMinimumNumber(randomList, Some(randomList(i)), i + 1)
  else
    println(s"Minimum: ${acc.getOrElse("???")}")
}

...和...

def Average(randomList: List[Int]): Int = {//`enter code here` (commented out)

不保证它可以运行或做任何有用的事情,但可以编译。

答案 1 :(得分:1)

几件事:

  1. val randomList: List[Long] = generateList(20)
    

    您将其定义为List[Long],然后调用一堆需要List[Int]的函数。这些是不可互换的。将其更改为val randomList: List[Int] = ....

  2. def printMinimumNumber(randomList: List[Int], acc: Option[Int] = None, i: Int = 0): Unit = {
       if (i < randomList.size)
         val temporaryMinimum = acc
         if (!acc.isDefined || randomList(i) < acc.get)
           temporaryMinimum = randomList(i)
         printMinimumNumber(randomList, Some(temporaryMinimum), i + 1)
       else
         println(s"Minimum: ${acc.getOrElse("???")}")
     }
    

    虽然有时可以不用花括号(例如,简单的单行表达式)来逃避,但不能完全避免使用花括号。您需要在外部if / else周围加上花括号:if (i < randomList.size) { ... } else { ... }

    此外,您无法重新分配val(您正在使用temporaryMinimum进行此操作)。如果要将相同的变量分配给不同的值,请使用var。另外,accOption[Int],而不是Int,因此,如果要在开始时分配acc.getOrElse(0),则需要进行类似temporaryMinimum的操作此功能。一般来说,此功能已经非常难看,但至少可以编译。

  3. def Average(randomList: List[Int]): Int = {`enter code here`
       randomList.foldLeft(0)(_ + _) / randomList.size
    }
    

    摆脱enter code here部分。不确定为什么在那里。

Et voilà, it compiles!这是我一段时间以来见过的最笨拙的代码,但至少现在可以打印出 something