我必须仅使用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的返回类型。但是我不确定我必须用这个函数给出什么。
任何人都有线索? :)
答案 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))
希望有所帮助。