在Scala中仅使用foldRight,foldLeft和展开实现map函数

时间:2012-03-07 18:53:53

标签: scala map functional-programming

我必须仅使用foldRight,foldLeft和展开来实现Map函数。这意味着我必须遍历列表中的每个元素并对其应用函数f。

我已将自己的名单声明如下:

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

我已经实现了foldRight,foldLeft和展开功能。

和新地图功能的实现:

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

我一直在考虑一段时间,但我不知道从哪里开始。我可能不会在map函数中使用递归。我很确定我必须将折叠和展开的力量结合在一起。 Unfold返回一个IntList,它是map的返回类型。但是我不确定我必须用这个函数给出什么。

任何人都有线索? :)

2 个答案:

答案 0 :(得分:2)

匹配类型,填写要匹配的参数。

例如,如果您要使用foldRight,则B必须为IntList,因为这是map返回的类型。现在使用与类型匹配的任何值填充foldRight的参数。

答案 1 :(得分:1)

[回复之前的评论。]

我不知道你给出的确切变体。假设它是这样的(在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))

希望有所帮助。