我完全没有使用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
}
}
答案 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)
几件事:
val randomList: List[Long] = generateList(20)
您将其定义为List[Long]
,然后调用一堆需要List[Int]
的函数。这些是不可互换的。将其更改为val randomList: List[Int] = ....
。
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
。另外,acc
是Option[Int]
,而不是Int
,因此,如果要在开始时分配acc.getOrElse(0)
,则需要进行类似temporaryMinimum
的操作此功能。一般来说,此功能已经非常难看,但至少可以编译。
def Average(randomList: List[Int]): Int = {`enter code here`
randomList.foldLeft(0)(_ + _) / randomList.size
}
摆脱enter code here
部分。不确定为什么在那里。
Et voilà, it compiles!这是我一段时间以来见过的最笨拙的代码,但至少现在可以打印出 something 。