Реализация MyMap (функция высшего порядка) в Scala
myMap должен принимать две функции карри. 1) Общий список 2) Функция, которая оценивает каждый элемент списка.
Возвращаемым значением myMap является List после применения Function к каждому элементу.
def myMap (f: Int=>Int) ( L:List[Int]) : List[Int] =
{
var xx = L
if(L.isEmpty) Nil
val (head::tail) = xx
f(head) :: myMap (f) (tail)
}
Это дает мне неизменное предупреждение.
2 ответа
Это рабочее решение
def myMap(f: Int => Int)(list: List[Int]): List[Int] = {
list match {
case Nil => Nil
case head :: tail =>
f(head) :: myMap(f)(tail)
}
}
Ваш код (помимо форматирования) имеет ряд проблем.
Не используйте заглавные буквы для значений
Ваш var
бессмысленно, так как вы никогда не изменяете его, это назначение в любом случае бесполезно, так как вы можете просто использовать свой аргумент.
Ваш, если нужно еще, в противном случае он волшебным образом не вернет, что Nil
Вы можете сделать эту функцию универсальной, заменив Int универсальным типом
def myMap[A](f: A => A)(list: List[A]): List[A] = {
list match {
case Nil => Nil
case head :: tail =>
f(head) :: myMap(f)(tail)
}
}
Чтобы заставить ваше решение if else работать, вы можете сделать это:
def myMap[A](f: A => A)(list: List[A]): List[A] = {
if (list.isEmpty) {
Nil
} else {
val (head :: tail) = list
f(head) :: myMap(f)(tail)
}
}
Ваше решение будет работать, если вы добавите отсутствующий блок else
def myMap (f: Int=>Int) ( L:List[Int]) : List[Int] = {
var xx = L
if(L.isEmpty) Nil
else {
val (head::tail) = xx
f(head) :: myMap (f) (tail)
}
}