scala - 我对下面的scala代码的理解正确吗?

标签 scala

我只是想理解下面的代码:

<小时/>

这里声明了一个新的类型别名 Set,它是一个采用 Int 的函数 参数并返回一个 bool 值

type Set = Int => Boolean
<小时/>

这里声明了一个新方法“contains”,它采用 Set 和 Int 类型的两个参数 它返回一个 bool 值。 bool 值设置为前面声明的函数 ('类型 Set = Int => Boolean') 但是执行什么逻辑来确定 Int 'elem' 是否是 Set 's' 的成员

def contains(set: Set, elem: Int): Boolean = set(elem)
<小时/>

这里定义了一个方法,它返回一个集合,该集合返回一个函数?

def singletonSet(elem: Int): Set = set => set == elem
<小时/>

带注释的完整代码:

  /**
   * We represent a set by its characteristic function, i.e.
   * its `contains` predicate.
   */
  type Set = Int => Boolean

      /**
       * Indicates whether a set contains a given element.
       */
def contains(set: Set, elem: Int): Boolean = set(elem)

      /**
       * Returns the set of the one given element.
       */
      def singletonSet(elem: Int): Set = set => set == elem

最佳答案

让我们按逻辑顺序倒着读。

假设您有一组有限的整数:例如 0, 1, 2, 3, 5, 8

描述这组整数的一种方法是通过一个函数(其 characteristic or indicator function ),对于每个整数,如果该整数在集合中,则返回 true,如果不在集合中,则返回 false。 正如我们所描述的,这个函数的签名必须始终是 Int => Boolean (“给我一个整数,我会告诉你它是否在集合中”),而它的实现将根据不同的情况而有所不同在特定的集合上。

对于上面示例中的集合,您可以将此函数简单地编写为:

val mySet: Int => Boolean = x => Array(0,1,2,3,5,8) contains x

或者认识到集合中的整数是斐波那契数列的第一个整数,并以稍微更复杂的方式定义 f(我在这里不会这样做......)。 请注意,我使用的“包含”是为所有 scala 集合定义的。 无论如何,现在您有了一个函数可以告诉您集合中包含哪些内容以及不包含哪些内容。 让我们在 REPL 中尝试一下。

scala> val mySet: Int => Boolean = x => Array(0,1,2,3,5,8) contains x
mySet: Int => Boolean = <function1>

scala> mySet(3)
res0: Boolean = true

scala> mySet(9)
res1: Boolean = false

现在,mySet 具有类型 Int => Boolean,如果我们将其定义为类型别名,我们可以使其更具可读性。

scala> type Set = Int => Boolean
defined type alias Set

除了可读性之外,将 Set 定义为 Int => Boolean 的别名也明确表明,在某种程度上,Set其特征功能。我们可以使用 Set 类型别名以更简洁(但在其他方面等效)的方式重新定义 mySet:

scala> val mySet: Set = x => Array(0,1,2,3,5,8) contains x
mySet: Int => Boolean = <function1>

现在是这个长答案的最后一部分。让我们定义一个特征函数来描述这个单例集:3。 简单:

val Singleton3 : Set = set => set == 3

对于仅包含 4 个的单例集,它将是:

val Singleton4 : Set = set => set == 4

因此,让我们概括这些函数的创建,并编写一个返回 Singleton 函数的方法,该函数对于任何整数,都描述仅包含该整数的集合:

def singletonSet(elem: Int): Set = set => set == elem
<小时/>

附录:

我跳过了这一部分,因为它并不是真正需要的:def contains(set: Set, elem: Int): Boolean = set(elem)

我认为这有点毫无意义,并且(没有更多上下文)它看起来就像一个人为的示例,用于演示如何将函数作为参数传递,就像 scala 中的任何其他类型一样。它采用 Int => Bool 函数和 Int 并将该函数应用于 Int,这样您就可以执行

scala> contains(mySet, 3)
res2: Boolean = true

这就像直接调用mySet(3)

关于scala - 我对下面的scala代码的理解正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13052735/

相关文章:

Scala 集合选择元素,直到第一个满足要求

java - 从 Java 访问 Scala 嵌套类

forms - 如何在 scala/lift 中创建一个简单的 Web 表单

scala - 设置 SBT 依赖项时,% 和 %% 运算符会做什么?

list - Scala将Collection转换为Key-key的最佳方法? (第二变种)

scala - Kotlin 序列会缓存中间结果吗?

java - 在 Scala 中从 java.util.Set 构造一个 java.util.List

scala - Seq.map中如何选择输出集合类型?

json - Scala,喷雾-json : universal enumeration json formatting

Scala BigDecimal 除法