я следующие функциитип Scala проверки ошибок компиляции
def map[A,B](l: List[A])(f: A => B): List[B]
def concat[A](l: List[List[A]]): List[A]
Я хотел бы реализовать это один
def flatMap[A,B](l: List[A])(f: A => List[B]): List[B]
Теперь я знаю, что правильное решение (так что это не вопрос)
def flatMap[A,B](l: List[A])(f: A => List[B]): List[B] =
concat(map(l)(f))
Но когда я пытался решить ее, я впервые попробовал с (я забыл Concat)
def flatMap[A,B](l: List[A])(f: A => List[B]): List[B] =
map(l)(f)
// compilation output
[error] found : A => fpinscala.datastructures.List[B]
[error] required: A => B
[error] map(l)(f)
Я не могу понять эту ошибку, потому что выглядит как оценки map(l)(f)
неправильно, но это не так, то возвращаемое значение функции flatMap, что является неправильным.
Фактически, если разложить одну и ту же реализацию в двух строках кода, мы увидим, что компилятор Scala жалуется на другую ошибку - на самом деле это ошибка, которую я ожидал и в предыдущем коде.
def flatMap[A,B](l: List[A])(f: A => List[B]): List[B] = {
var result = map(l)(f)
result
}
// compilation output
[error] found : fpinscala.datastructures.List[fpinscala.datastructures.List[B]]
[error] required: fpinscala.datastructures.List[B]
[error] result
Может кто-нибудь объяснить мне, почему компиляция первой попытки кода дается различного рода ошибки, что второй один?
Согласен, но это не объясняет, почему компилятор Scala жалуется на него в первом коде, но не во втором. Единственное различие заключается в том, что во втором я сохраняю результат в переменной, но вызов функции карты тот же. –