【问题标题】:Create 1 function from 2 other functions in scala?从scala中的2个其他函数创建1个函数?
【发布时间】:2014-07-02 22:03:34
【问题描述】:

这个问题与 coursera 的 scala 课程有关,所以我想请你不要给我可以复制粘贴的简单解决方案,因为这会破坏 coursera 荣誉代码。

这与第二个作业有关。

def Set = Int => Boolean

可以看出,Set 是一个函数,它返回天气与否,给定的 int 是或不是集合的一部分。到目前为止,这很简单。但是任务要求我创建一个工会

 def union(f: Set, s: Set): Set = ???

这个联合应该返回一个满足两个集合条件的集合。 我怎么能做这样的事情:

我认为可以通过将函数添加在一起来完成这样的事情,但是下面的代码:

f + s

无法按预期正确编译

我的问题是:

我如何能够从其他 2 个函数创建一个函数?

x => if x == 0 true else false //first
x => if x == 1 true else false //second

什么应该相等:

x => if x==0 || x == 1 true else false

我不是在寻求解决方案,而是我将如何构建这样的东西?

【问题讨论】:

  • 您可以使用(x => ...) 创建Set 的实例。在正文中,您需要将fs 应用到x,然后结合结果得到答案。
  • 您已经构建了它。只需要改写它。考虑if true true else false 只是true 的事实。

标签: function scala functional-programming


【解决方案1】:

我想你已经明白了,这些 Set 是用于测试一个值是否符合每个 Set 标准的函数。

这样一个 Set 的并集也必须是一个返回布尔值的函数(如类型签名所示)

def union(f: Set, s: Set): Set

其中(因为Set 是类型别名)等价于:

def union(f: Int => Boolean, s: Int => Boolean): Int => Boolean

在简单的英语中,两个集合 A 和 B 的并集的意思是:“是 A B 中的项目”。

你的任务是编写一个执行简单英语规范的函数。

您不能将两个函数“添加”在一起(至少,不能以适用于该问题的方式),但您可以组合它们的结果。

【讨论】:

    【解决方案2】:

    Set 的形式为Set = Int => Boolean。鉴于 Int 函数将返回 true 如果值在 Set 中。

    如果我们想创建一个单例集,我们将返回 new 函数,该函数会将传递给它的任何值与传递给创建它的函数的值进行比较。

    两个集合的并集,是一个集合加上另一个集合。这意味着您要查找的元素必须在一个 另一个集合中。但是我们如何获得 new 集合,我们返回一个 new 函数,它就是这样做的 - 检查一个元素是否在一个集合或另一个集合中。

    请记住,在 Scala 中,函数可以返回函数,这些函数可能会在以后进行评估。我认为这是关键。

    【讨论】:

    • 接受@DNA,因为他比你早 30 分钟回复。然而,这是一个很好的解释。我还在用 OOP 的方式思考
    【解决方案3】:

    Set 被定义为从IntBoolean 的函数,“求和”两个 Set 不会返回 Set 对象,联合意味着一个元素应该在一个或在其他集合,但始终表示为函数。

    我希望这不是太多,但给定一个元素,它应该满足fs

    【讨论】:

      【解决方案4】:

      首先是type Set =。不是defSet 是类型别名而不是函数定义。

      现在,你的问题。您需要一个函数,当给定两个 Int =>Boolean 时,将它们与 OR 组合并返回 Int => Boolean

      首先,您将如何处理两个 Boolean 参数?

      def or(a: Boolean, b: Boolean) = a || b
      

      所以现在我们已经完成了一半。我们有什么:

      • 一对Int => Boolean 函数。
      • 一个接受两个Booleans 并返回一个Boolean 的函数。

      所以我们需要做的就是应用每个SetInt 以获得Boolean 和OR 结果。混乱可能就在这里。

      对函数进行柯里化的最简单方法是显式执行

      def union(f: Set, s: Set): Set = {
          def doUnion(x: Int) = //apply x to f and s, return OR
          doUnion
      }
      

      但我们可以,在 Scala 中,通过声明一个匿名函数来内联

      def union(f: Set, s: Set): Set = x => //apply x to f and s, return OR
      

      【讨论】:

        猜你喜欢
        • 2018-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-07
        相关资源
        最近更新 更多