LINUX.ORG.RU

Scala

 


0

2

Изучаю тут скалу и ФП. Так вот, решаю всякие простенькие задачки.

Дан список из списков целых чисел. Составить список из длин этих спи-сков. Например, если исходный список равен [[1, 3, 5], [4, 6], [1, 9, 8]], то в результате должен получится список [3, 2, 3]

import scala.annotation.tailrec

object HelloWorld {
  def main(args: Array[String]) = {
    @tailrec
    def abc(list: List[List[Int]]): List[Int] = {
      @tailrec
      def cba(l: List[Int], acc: Int): Int = {
        l match {
          case Nil => acc
          case l => cba(l.tail, acc + 1)
        }
      }
      list match {
        case Nil => Nil
        case x => {
          cba(list.head, 0) :: List[Int]()
          abc(list.tail)
        }
      }
    }
    val list1 = List(List(1, 2, 3), List(1, 2, 3), List(1, 2, 3), List(1, 2, 3, 4, 5, 6), List(1, 2, 3, 4))
    abc(list1) foreach println
  }
}

Но в итоге выводится пустой список. В чем может быть проблема?

scala> val list1 = List(List(1, 2, 3), List(1, 2, 3), List(1, 2, 3), List(1, 2, 3, 4, 5, 6), List(1, 2, 3, 4))
list1: List[List[Int]] = List(List(1, 2, 3), List(1, 2, 3), List(1, 2, 3), List(1, 2, 3, 4, 5, 6), List(1, 2, 3, 4))

scala> list1.map( x => x.length)
res0: List[Int] = List(3, 3, 3, 6, 4)
cool_hedin ()

ТС, а ты что своим кодом сделать-то пытался? Я вот читаю и понять не могу. Нет, основную задачу я понял... а по шагам ты как пытался её решить? Что делает cba? для чего abc рекурсивная?.. и т.п.

BattleCoder ★★★★★ ()
Ответ на: комментарий от misterious

Не вопрос.

def func(l: List[List[Int]], acc: List[Int]): List[Int] = {
  if (l.isEmpty) acc
  else func(l.tail, l.head.length :: acc)
}

Примерно так.

И ещё reverse в конце может понадобиться...

BattleCoder ★★★★★ ()
Последнее исправление: BattleCoder (всего исправлений: 1)
Ответ на: комментарий от BattleCoder

Ну для лучшего въезжания в рекурсию решаю вот такие задачки. В cba с помощью аккумулятора я считаю длину каждого списка, находящегося в списке, который передается в abc.

misterious ()
Ответ на: комментарий от misterious

А, тебе ещё и длину считать отдельной функцией? Ну просто реализуй свой length, потом вызови его аналогично.

BattleCoder ★★★★★ ()
          cba(list.head, 0) :: List[Int]()
          abc(list.tail)

вот тут ты что делаешь? Сначала вычисляешь длину списка, превращаешь эту длину в список из одного элемента, потом забываешь про всё это и возвращаешь abc(list.tail). Я думаю ты хотел написать

          cba(list.head, 0) :: abc(list.tail)

Legioner ★★★★★ ()
Ответ на: комментарий от Legioner

Блин, вот что-то я совсем затупил. Все, спасибо всем, я понял, что не так было. Всё-таки скала классная штука. По крайней мере первое время, надеюсь, что дальше не разочаруюсь)

misterious ()
Ответ на: комментарий от misterious

Скала - очень плохой язык для написания функциональных программ за пределами факториала, требующий огромного количества диспицлины. Среди проблем: слабая (any2stringadd, universal equality, null) и переусложненная (subtyping) система типов, TCO, ограниченное прямой рекурсией, и полное отсутствие полезных ФП-абстракций в стандартной библиотеке.

Впрочем, Functional Programming in Scala - лучшая книга про ФП, которую я видел; не для новичков, правда. Вот такой вот курьез.

anonymous ()
Ответ на: комментарий от anonymous

Скала - очень плохой язык для написания функциональных программ

А какой язык хороший?

Functional Programming in Scala - лучшая книга про ФП

Лорчую этого анона. Весьма годная книга.

ymn ★★★★★ ()
Ответ на: комментарий от anonymous

Скала - очень плохой язык для написания программ за тарелкой мамкиного борща.

fixed.

ovk48 ★★★ ()

Замени в паттерн-матчинге case x на case head :: tail и больше не пользуйся такими вещами как list.head и list.tail.

Miguel ★★★★★ ()
Ответ на: комментарий от anonymous

TCO, ограниченное прямой рекурсией

А это разве проблемы не с jvm?

полное отсутствие полезных ФП-абстракций в стандартной библиотеке.

Каких абстракций? Можно примеры? В любом случае, скорей всего, есть дополнительные библиотеки, она же относительно популярная. Не обязательно же все тащить в стандартную либу.

misterious ()
Ответ на: комментарий от misterious

Кстати, а подскажите, кто пишет на работе на скалке, там вообще используется фп стиль? Или на ней пишут, как улучшенной джаве?

misterious ()
Ответ на: комментарий от anonymous

А за книжку спасибо большое, обязательно попытаюсь осилить после Одерского.

misterious ()
Ответ на: комментарий от Miguel

Спасибо за совет, я в этом деле только учусь, поэтому рад любому наставлению)

misterious ()
Ответ на: комментарий от misterious

там вообще используется фп стиль? Или на ней пишут, как улучшенной джаве?

На скале можно писать по-всякому. Если не хватает скиллов ФП - пиши как на яве++, пока не появятся, если суровый ФПер - обмазывайся HKT и прочим, если хочешь писать прагматично, в зависимости от задачи - пиши прагматично. Лично я даже со своим далеко не высоким уровнем наколенных поделок никогда в ява-стиле не пишу, потому что когда осознаешь возможности скалы как языка, этого просто не хочется.

ovk48 ★★★ ()
Ответ на: комментарий от misterious

В современной жаве пишут вполне в ФП стиле, хотя фиг его знает что ты там под ФП стилем понимаешь.

dizza ★★★★★ ()
Ответ на: комментарий от misterious

В любом случае, скорей всего, есть дополнительные библиотеки

Scalaz

LongLiveUbuntu ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.