Jestem nowy w nauce Scali i dokładnej pracy nad książką Programowanie funkcjonalne w Scali. Mam kilka problemów koncepcyjnych i programistycznych, które próbują przetestować moje rozwiązania do ćwiczeń, które dotyczą prawidłowego wywoływania metod zdefiniowanych w obiekcie towarzyszącym.
Mam następujący typ danych MyList
które zdefiniowałem wraz z książką
sealed trait MyList[+A]
case object Nil extends MyList[Nothing]
case class Cons[+A](head: A, tail: MyList[A]) extends MyList[A]
object MyList {
def apply[A](as: A*): MyList[A] = {
if (as.isEmpty) Nil
else Cons(as.head, apply(as.tail: _*))
}
def sum(ints: MyList[Int]): Int = ints match {
case Nil => 0
case Cons(x, xs) => x + sum(xs)
}
def product(ds: MyList[Double]): Double = ds match {
case Nil => 1
case Cons(x, xs) => x * product(xs)
}
}
Chciałbym przetestować moją implementację metod apply
, sum
i product
w obiekcie towarzyszącym. W tym celu dodałem następujące wiersze (te działają) do pliku po definicji obiektu
val x = MyList(1, 2, 3, 4)
println(x)
Jeśli je uruchomię (jestem osobą z linii poleceń, więc jest to sesja powłoki bash), wydaje się, że działa tak, jakbym się spodziewał
$ scala ch3-list.scala
Cons(1,Cons(2,Cons(3,Cons(4,Nil))))
Ale mam problem z pozostałymi dwiema funkcjami. Próbowałem następujących kombinacji
println(x.sum())
println(sum(x))
println(x.sum(x))
println(x.sum)
i wszystkie dają mi błędy. Na przykład, x.sum()
, co, jak myślałem, najprawdopodobniej zadziała, daje
$ scala ch3-list.scala
/Users/matthewdrury/Projects/fp-in-scala/ch3-list.scala:28: error: value sum is not a member of this.MyList[Int]
println(x.sum())
^
Jestem nowy w Scala i nie mam doświadczenia w Javiealbo, więc zasady określania zakresu są dla mnie nadal niejasne. Chciałbym wiedzieć, czego mi tu brakuje, i uzyskać porady dotyczące najlepszego przepływu pracy, aby skonfigurować dalsze metody tego rodzaju.
Odpowiedzi:
2 dla odpowiedzi № 1Szukasz MyList.sum(x)
.
The sum
metoda znajduje się w obiekcie towarzyszącym, a nie jest zdefiniowana jako element członkowski MyList
klasa.