首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Scala中仅使用foldRight、foldLeft和unfold实现地图功能

在Scala中仅使用foldRight、foldLeft和unfold实现地图功能
EN

Stack Overflow用户
提问于 2012-03-08 02:53:53
回答 2查看 2.6K关注 0票数 3

我必须仅使用foldRight、foldLeft和unfold来实现映射功能。这意味着我必须遍历列表中的每个元素,并对其应用函数f。

我已经声明了我自己的列表如下:

代码语言:javascript
复制
abstract class IntList
case class Nil() extends IntList
case class Cons(h: Int, t: IntList) extends IntList

我已经实现了foldRight,foldLeft和unfold函数。

以及新的map函数的实现:

代码语言:javascript
复制
def map(ls: IntList, f: Int => Int): IntList = // ??

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

谁有线索?:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-08 04:15:02

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

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

票数 3
EN

Stack Overflow用户

发布于 2012-03-09 05:10:49

回复之前的评论。

我不知道给你的是哪一种具体的展开版本。假设它是这样的(在Ocaml中,对不起,现在没有安装Scala ):

代码语言:javascript
复制
(* 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的解决方案如下所示:

代码语言:javascript
复制
let map f = unfold (function [] -> None | x::xs -> Some (f x, xs))

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9607371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档