Я поместил следующий код в файл object.Scala в Eclipse и просто хочу знать, каково значение для «x» (оно должно быть 3). Код не будет компилироваться, если я помещу значение где-нибудь, кроме объекта List; в то же время, когда файл находится внутри объекта List, результат не выводится.
package work
object Work extends App {
// These 3 lines define a simplified List type
sealed trait List[+A]
case object Nil extends List[Nothing]
case class Cons[+A](head: A, tail: List[A]) extends List[A]
// This companion object contains basic operations for the List type
object List {
def sum(ints: List[Int]): Int = ints match {
case Nil => 0
case Cons(x,xs) => x + sum(xs)
}
def product(ds: List[Double]): Double = ds match {
case Nil => 1.0
case Cons(0.0, _) => 0.0
case Cons(x,xs) => x * product(xs)
}
def apply[A](as: A*): List[A] =
if (as.isEmpty) Nil
else Cons(as.head, apply(as.tail: _*))
// The next line is the value that I want to return.
val x = List(1,2,3,4,5) match {
case Cons(x, Cons(2, Cons(4, _))) => x
case Nil => 42
case Cons(x, Cons(y, Cons(3, Cons(4, _)))) => x + y
case Cons(h, t) => h + sum(t)
case _ => 101
}
}
}
Сначала я поместил все в object Work extends App
, чтобы он мог скомпилироваться, иначе компилятор жалуется, что мне не хватает метода Main. Но чтобы получить "x", я попытался отказаться от объекта Work и вместо этого добавил метод Main к выражению, которое я хочу видеть оцененным, как показано ниже:
def main(args: Array[String]) {
val x = List(1,2,3,4,5) match {
case Cons(x, Cons(2, Cons(4, _))) => x
case Nil => 42
case Cons(x, Cons(y, Cons(3, Cons(4, _)))) => x + y case Cons(h, t) => h + sum(t)
case _ => 101
}
}
Однако затем я получаю следующую ошибку:
List имеет основной метод с типом параметра Array [String], но работает. List не будет исполняемой программой. Причина: компаньон - это свойство, которое означает, что невозможно создать статический сервер пересылки.
Я не совсем понимаю, что это значит. Я также очень запутался в том, как правильно реализовать метод Main. Я попытался добавить метод Main непосредственно под объектом List, инкапсулируя все определения List и val x, и это привело к еще большему количеству ошибок, чем указано выше. Я сбит с толку и все еще ищу в сети ответы, но пока ничего не решает мою конкретную проблему.
Любая помощь будет принята с благодарностью.
Ниже мой исходный пост, содержащий дополнительную информацию, включая текст упражнения, над которым я работаю. Чтобы работать над упражнением, мне нужно посмотреть, как оцениваются выражения. Обычно я работаю в Scala Worksheet именно по этой причине, так как я могу видеть свои результаты в течение нескольких секунд, но это конкретное упражнение включает использование признака и сопутствующего объекта, и их добавление чрезвычайно усложнило для меня вещи, поскольку, пока я понимаю как они используются в коде, я не знаю, как их правильно реализовать.
Исходный пост
Я поместил следующий код в Scala Worksheet Eclipse IDE, а затем потратил около двух часов, пытаясь сделать это разными способами.
- компилировать без ошибок, и
- отображать оцененные результаты справа.
Я все еще много борюсь с (2).
package fpinscala.datastructures
// The following three lines define a simplified List type and behavior
sealed trait List[+A]
case object Nil extends List[Nothing]
case class Cons[+A](head: A, tail: List[A]) extends List[A]
// The companion object List defines basic List operations
object List {
def sum(ints: List[Int]): Int = ints match {
case Nil => 0
case Cons(x,xs) => x + sum(xs)
}
def product(ds: List[Double]): Double = ds match {
case Nil => 1.0
case Cons(0.0, _) => 0.0
case Cons(x,xs) => x * product(xs)
}
def apply[A](as: A*): List[A] =
if (as.isEmpty) Nil
else Cons(as.head, apply(as.tail: _*))
}
Когда я запускаю приведенный выше код, он выдает стандартную ошибку о том, что отсутствует главный аргумент. Хотя я не очень понимаю, как на самом деле работают def main(args: Array[String) {}
или object some_object extends App {}
, я знаю, что они позволяют коду действительно компилироваться и запускаться. В то же время Scala Worksheet никогда не требовал, чтобы у меня был метод Main в прошлом, хотя в прошлом я также не использовал классы или черты в том же файле. Я знаю, что должен быть чего-то не хватает.
я пробовал
- extending the List object with App
- or adding a def main argument underneath it
- creating an object called "Classes" for the sealed trait and adding the main argument to it
- or extending it with App
- creating a larger object "Worksheet" that I then added all of the following to under a def main argument
- or extending "Worksheet" with App
- в другом файле Eclipse IDE, создав новый признак Scala, добавив в него признак и код класса, а затем попытавшись импортировать его в рабочий лист, понимая, что список сопутствующих объектов должен существовать в том же файле
- помещая весь приведенный выше код в другой файл, пытаясь импортировать этот файл на лист и пытаясь заставить любую из операций со списком работать (проблема здесь в том, что я на самом деле не знаю к какому типу файла Scala в среде Eclipse IDE будет принадлежать приведенный ниже код, объекту, классу или признаку)
Некоторые из них были скомпилированы, другие - нет, но ни один из них пока не привел к тому, что рабочий лист фактически дает оцененные результаты с правой стороны.
Вот упражнение, требующее приведенного выше кода, над которым я пытался работать, если бы я только мог видеть, как оценивается мой код:
Давайте попробуем реализовать несколько различных функций для изменения списков разными способами. Вы можете поместить эту и другие функции, которые мы пишем, в сопутствующий объект List.
3.2. Реализуйте функцию tail для удаления первого элемента списка. Обратите внимание, что функция требует постоянного времени. Какие варианты выбора вы могли бы сделать в своей реализации, если бы List был равен Nil? Мы вернемся к этому вопросу в следующей главе.
из Функциональное программирование на Scala а>.
Большое спасибо за ваше время.