Я сейчас прохожу красную книгу «Функциональное программирование в Scala», поэтому в то же время я изучаю Scala. Если я правильно понимаю, черта не означает объект. Поправь меня, если я здесь не прав.
Моя проблема в том, что я не знаю, как создать список типа A, в то время как он заключен в черту Some
. Буду признателен за подсказки в правильном направлении.
В упражнении, которое я выполняю, меня просят определить функцию, которая должна преобразовывать каждый элемент в списке, а затем иметь весь список внутри черты Some
.
вот мой код:
def traverse[A, B](a: List[A])(f: A => Option[B]): Option[List[B]] = a match {
case Nil => Nil: B
case h :: t => f(h) flatMap ( hh => hh :: traverse(t)(f))
}
Мне кажется, что я на правильном пути, но интерпретатор scala жалуется, что ::
недоступен для Option[List[B]]
. Я думаю, это потому, что сигнатура функции не возвращает список, она возвращает список, заключенный в Some.
Но может ли моя интуиция насчет flatMap также ошибаться? f(h)
возвращает Option[B]
. Вызов flatmap на самом деле выглядит внутри Option, поэтому hh имеет тип B
правильно? Моя логика заключается в том, что таким образом я могу создать список типа B с помощью функции hh :: traverse(t)(f)
. Но я не совсем уверен в том, что я здесь.
Если это имеет какое-то значение, я использую интерпретатор scala с командой: paste. Я не уверен, что из-за этого дела идут плохо.