Реализация 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)
  }
 }
Другие вопросы по тегам