Скала хочет от меня применить метод - PullRequest
2 голосов
/ 27 июня 2010
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 ]

3 голосов
/ 27 июня 2010

в своем заявлении о том, что вы забыли паренов: lst = List[A]() Фактически, List[A](a,b,c) является синтетическим сахаром для List[A].apply(a,b,c), поэтому компилятор жаловался на аргументы apply.

Редактировать: вы можете использовать ListBuffer вместо своего списка (в методе Fill, и, кстати, имя должно быть заполнено (см. http://davetron5000.github.com/scala-style/)). Когда вы закончите работу, чтобы сделать в буфере вы можете вызвать toList, который рассчитывает на постоянное время;).

1 голос
/ 28 июня 2010

См. Ответ Аймена для общих указаний. После обновления вы получаете следующий эффект.

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)

вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...