Реализация функции карты с использованием только foldRight, foldLeft и развернуть в Scala - PullRequest
2 голосов
/ 07 марта 2012

Мне нужно реализовать функцию Map, используя только foldRight, foldLeft и развернуть. Это означает, что я должен пройтись по каждому элементу в списке и применить к нему функцию f.

Я объявил свой список следующим образом:

abstract class IntList
case class Nil() extends IntList
case class Cons(h: Int, t: IntList) extends IntList

И я реализовал функции foldRight, foldLeft и unold.

и реализация новой функции карты:

def map(ls: IntList, f: Int => Int): IntList = // ??

Я немного подумал, но понятия не имею, с чего начать. Я не могу использовать рекурсию в функции карты. Я уверен, что мне нужно объединить силу сгиба и раскрытия. Развернуть возвращает IntList, который является возвращаемым типом карты. Но я не уверен, что я должен дать с этой функцией.

У кого-нибудь есть подсказка? :)

Ответы [ 2 ]

2 голосов
/ 08 марта 2012

Сопоставьте типы, заполните соответствующие аргументы.

Например, если вы собираетесь использовать foldRight, тогда B должно быть IntList, потому что это тип, возвращаемый map.Теперь заполните аргументы для foldRight теми значениями, которые у вас есть, которые соответствуют типам.

1 голос
/ 09 марта 2012

[В ответ на предыдущие комментарии.]

Я не знаю, какой именно вариант раскрытия вам дан.Предполагая, что это что-то вроде этого (в Ocaml, извините, сейчас нет установленного Scala):

(* unfold : ('a -> ('b * 'a) option) -> 'a -> 'b list *)

let rec unfold f x =
  match f x with
  | None -> []
  | Some (y, x') -> y :: unfold f x'

Тогда решение для map будет следующим:

let map f = unfold (function [] -> None | x::xs -> Some (f x, xs))

Надеюсь, это поможет.

...