import java.util.Random
class Kostka {
val rand = new Random(System.currentTimeMillis())
val value: List[Int] = List(rand.nextInt(6+1))
}
object MyRandom {
def Fill[A](n: Int): List[A] = {
if (n<=0) Nil
else {
var lst = List[A]
for (i <- 1 to n){
lst ++= (new Kostka).value
}
return lst
}
}
}
object Gra {
def main(args: Array[String]): Unit = {
println("Podaj liczbe kosci\n")
val kosci: List[Kostka] = MyRandom.Fill[Kostka](10)
// Policzenie wyniku
println("Strzelaj ile razem wypadło\n")
// przyjecie wyniku
// dopisac ile wypadlo czyli wynik
println("Wypadlo: ")
println(kosci.toString)
}
}
错误:
a.scala:10: error: missing arguments for method apply in object List;
follow this method with `_' if you want to treat it as a partially applied function
var lst = List[A]
^
one error found
当我有:
var lst = List[A]()
我收到了这个错误:
a.scala:12: error: type mismatch;
found : List[Any]
required: List[A]
lst ++= (new Kostka).value
^
one error found
答案 0 :(得分:3)
在你的lst声明中忘记了parens:lst = List[A]()
实际上,List[A](a,b,c)
是List[A].apply(a,b,c)
的合成糖,这就是编译器抱怨apply
的论点的原因。
修改:您可以使用ListBuffer
代替您的列表(使用Fill
方法,顺便说一下,名称应填写(cf http://davetron5000.github.com/scala-style/))。当您完成缓冲区的工作时,您可以调用toList,它在常量时间计算;)。
答案 1 :(得分:1)
有关一般指南,请参阅Aymen's answer。更新后,您将获得以下效果。
Kostka.value
的类型为List[Int]
。 lst
的类型为List[A]
。追加(++
)的结果是List[Int]
和List[A]
的最不常见的超类型List[Any]
。但List[Any]
不是List[A]
的子类型。这就是你输入类型不匹配的原因。
您的Fill
方法首先不应该是通用的,除非您将Kostka
设为通用。
此外,使用new Kostka
结合PRNG初始化看起来也很奇怪。
最后,在Scala 2.8中,集合协同服务器上有一个fill
方法:
scala> val r = new java.util.Random
r: java.util.Random = java.util.Random@14a616
scala> List.fill(10) {r.nextInt(6+1)}
res4: List[Int] = List(3, 6, 4, 1, 2, 4, 0, 4, 6, 4)
并且,除非你的骰子是7面,否则你可以选择
scala> List.fill(10) {r.nextInt(6) + 1}
res5: List[Int] = List(2, 5, 2, 1, 1, 4, 4, 2, 6, 3)
代替。