Проблемы с возвратом значения при использовании признака и сопутствующего объекта в Scala (Eclipse IDE)

Я поместил следующий код в файл 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, а затем потратил около двух часов, пытаясь сделать это разными способами.

  1. компилировать без ошибок, и
  2. отображать оцененные результаты справа.

Я все еще много борюсь с (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 .

Большое спасибо за ваше время.


person Nicholas Montaño    schedule 09.05.2015    source источник


Ответы (1)


Я не уверен, почему вы упомянули, что размещение val x вне объекта List препятствует компиляции.

Следующее компилируется и дает ожидаемый результат = 3

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 + List.sum(t)
    case _ => 101
  }

  println(x)
}
person AlexBrand    schedule 10.05.2015
comment
Я тоже не знаю почему. Думаю, я пробовал так много разных итераций, что когда я поместил val x вне объекта List, что-то еще мешало. В любом случае ваш код запустился после того, как я понял, что запускаю не тот файл в Eclipse; Спасибо большое за помощь! - person Nicholas Montaño; 10.05.2015
comment
Ах, я понимаю почему. Это произошло потому, что я, будучи новичком в понимании того, как работают объекты и классы, поместил val x за пределы объекта List, одновременно избавившись от объекта Work, что заставило Scala жаловаться, что он ожидал определения класса или объекта, где val x было . В то время я не был уверен, как на самом деле решить эту проблему, но с вашим кодом, показывающим мне, как выглядит правильно компилируемый код, я лучше понимаю, и теперь выяснил другой способ компиляции моего кода, а также возврата ценность. - person Nicholas Montaño; 10.05.2015