【问题标题】:Scala and Writing map functionsScala 和编写地图函数
【发布时间】:2017-04-04 11:26:40
【问题描述】:

所以假设我有一个函数,它需要一个定义为 Int => Boolean 的 Set 和一个函数 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 函数式编程课程的一部分。

【问题讨论】:

  • 如果这是关于 coursera 课程,您应该将其标记为作业。此外,在 coursera 练习中,如果不遍历集合中所有可能的值,您就无法做到这一点。
  • @DanielC.Sobral no, he should not tag it as homework
  • 他应该承认这是问题本身的作业,然后
  • @Daniel,没有 Homework 标签。所以我没有。
  • @Paul 是的,让我在帖子中代替。

标签: scala functional-programming


【解决方案1】:

本课程的目标是帮助您理解函数模型,以及在这种情况下,集合如何由函数表示(称为该集合的特征函数)。

这里是关于如何推理这个问题的提示,而不是最终解决方案:

给定定义集合的特征函数f: Int => Booleanx,一个Int,如果f(x) == true,那么x 属于集合。现在,如果你有一个函数g:Int=>Int 您想要映射到集合上,您想要将该函数应用于您知道属于集合的元素:if (f(x)) then g(x)

尝试将这种想法应用到您的练习中。

【讨论】:

  • 非常感谢@maasg 的明确答复。如果您能向我解释清楚,我将非常感激:'if (f(x)) then g(x)' 无论如何都等同于 'y => x == f(y)',这是 Scala 的一个诡计我不知道的语法?
  • 不,这些是不同的表达方式。 y => x == f(y) 是一个 lambda 表达式,表示“给定 y,对于 x(来自闭包上下文),如果 x 等于 f(y),则返回 true
  • @user1343318 您正在寻找的是一组元素,使得对于结果集中的每个元素y,原始集中应该有一个元素x 符合条件f(x)==y 这就是你的表达式 y => x == f(y) 的目标,但它仍然缺少一些东西......
【解决方案2】:

如果你正确编写了exists函数:

def map(s: Set, f: Int => Int): Set = (i: Int) => exists(s, (x: Int) => i == f(x))

敲一行!

【讨论】:

    【解决方案3】:

    您需要使用 fold 来执行此操作。

    def map(s: Set[Int], f: Int => Int): Set[Int] = 
        s.foldLeft(Set.empty[Int])((s,i) => s+f(i))
    

    【讨论】:

    • 嗯,f 还没有应用。不应该是 s.foldLeft(Set.empty[Int])((s,i) => s+f(i)) 吗?
    • 该问题涉及 Set: Set with definition Int => Boolean 的特定定义,您提出的解决方案将不适用于该定义
    猜你喜欢
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-21
    • 1970-01-01
    • 2011-10-11
    • 2011-09-06
    • 1970-01-01
    相关资源
    最近更新 更多