【问题标题】:Implementing the map function using only foldRight, foldLeft and unfold in Scala在 Scala 中仅使用 foldRight、foldLeft 和展开来实现地图功能
【发布时间】:2012-03-25 07:53:20
【问题描述】:

我必须仅使用 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 的返回类型。但我不确定我必须使用此功能提供什么。

有人知道吗? :)

【问题讨论】:

  • 提示:你只需要 either foldLeft or foldRight or 展开。最简单的解决方案是使用 foldRight。
  • 这是一个非常标准的任务。如果您不知道如何开始,请在 Google 上搜索。
  • 我已经用谷歌搜索了一段时间,但我找不到关于这个问题的类似主题。我知道这是一项标准任务,应该不难,但我只需要一个起点。
  • @AndreasRossberg 如何使用unfold 实现地图?

标签: scala map functional-programming


【解决方案1】:

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

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

【讨论】:

  • 嗯...我已经搜索了一些有关泛型类型的信息,我想我现在了解它们是如何工作的。会像以下工作吗?在这种情况下,B 是 IntList 类型: MyList.foldRight(as, Nil(), (x : Int, y : IntList) => Cons(f(x),Nil()))
  • @Devos50 我看起来像 REPL 吗?试试看!它不会咬你。 :-)
  • 呵呵,没错,但我已经写了一些测试,我想我明白了:) MyList.foldRight(as, Nil(), (x : Int, y : IntList) => Cons( f(x),y)) 我必须用 y 替换 Nil() ,否则递归将在第一次调用时停止!我想我必须更熟悉这些泛型类型。感谢大家的评论并帮助 scala 中的新手! :)
  • 您能否提示一下仅使用unfold 将如何做到这一点?
  • @ziggystar 我不确定如何使用unfold。我可以看到一个基于索引的解决方案,但它需要更多的工具,而不仅仅是直接实现map。除非在传递给unfold 的函数上使用可变状态,否则这是非常丑陋的。
【解决方案2】:

[回复以前的cmets。]

我不知道你得到了哪个确切的展开变体。假设它是这样的(在 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))

希望对您有所帮助。

【讨论】:

  • 谢谢。我花了一些时间来破译 OCaml 代码。我的问题是 OP 中的 def unfold(f: Int => Option(Int,Int), x: Int): List[Int] 定义(现在已删除)而不是 def unfold[A,B](f: A => Option(B,A), x: A): List[B],这更有意义。
  • 对我来说也一样。关于unfold 的实现有些东西要么是错误的,要么是令人困惑的,不过,再读一遍,它似乎是正确的。很奇怪。
猜你喜欢
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 2017-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多