Scala想从我这里申请方法

时间:2010-06-27 09:07:25

标签: scala syntax

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

2 个答案:

答案 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)

代替。