假设我有一个函数需要一个定义为Int => Boolean
的集合和一个函数f
,如下所示:
def map(s: Set, f: Int => Int): Set = {}
现在,如何将此f
应用于此集s
的每个元素。
def map(s: Set, f: Int => Int): Set = { (i: Int) => f(s(i)) }
哪个是不正确的,因为在f(s(i))
中,'s(i)'返回一个布尔值,因此不能对其应用f
。问题是如何访问Set的每个元素并在其上应用此f
?
这个问题是Coursera使用Scala课程的功能编程的一部分。
答案 0 :(得分:5)
本课程的目标是帮助您理解功能模型,在这种情况下,如何通过函数表示集合(称为该集合的charasteristic函数)。
而不是最终的解决方案,这里有一个关于如何推理这个问题的提示:
给定定义你的集合的特征函数f: Int => Boolean
和x
,如果是f(x) == true
,那么x属于集合。现在,如果你有一个函数g:Int=>Int
要在集合上映射,您想要的是将该函数应用于您知道属于集合的元素:if (f(x)) then g(x)
。
尝试将这种想法运用到练习中。
答案 1 :(得分:1)
如果您正确编写了存在函数:
def map(s: Set, f: Int => Int): Set = (i: Int) => exists(s, (x: Int) => i == f(x))
Bam一行!
答案 2 :(得分:-3)
您需要使用折叠来执行此操作。
def map(s: Set[Int], f: Int => Int): Set[Int] =
s.foldLeft(Set.empty[Int])((s,i) => s+f(i))