/ / Metody wywoływania w obiekcie towarzyszącym - scala

Wywoływanie metod w obiekcie towarzyszącym - scala

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 № 1

Szukasz MyList.sum(x).

The sum metoda znajduje się w obiekcie towarzyszącym, a nie jest zdefiniowana jako element członkowski MyList klasa.