【问题标题】:Why calling a function like this works in Scala?为什么调用这样的函数在 Scala 中有效?
【发布时间】:2014-07-26 15:06:37
【问题描述】:

我有以下 Scala 代码 sn-p:

type Set = Int => Boolean

def contains(s: Set, element:Int): Boolean = s(element)

def singletonSet(element: Int): Set = Set(element)

val oneElementSet = singletonSet(5)

contains(oneElementSet, 5) // true
contains(oneElementSet, 6) // false

我正试图理解它的作用:Set(element)。看起来它会用 element 代替 Int 参数来产生:5 => Boolean。哪里都没有比较,为什么oneElementSet(5)返回true,oneElementSet(6)返回false?

谢谢!

【问题讨论】:

  • 您能否检查定义singletonSet 返回的Set 的完整包?我认为您只是在scala.collection.immutable 下使用普通的Set,尝试设置type Set = Int => Int,如果您的代码仍然有效,那么您并没有真正使用您定义的Set,而是scala.collection.immutable 下的那个。
  • 这看起来像 coursera FunProg。我会为 Set 类型使用不同的名称以避免与 scala.collection.immutable.Set 发生冲突 执行以下操作:type MySet = Int => Boolean 它应该起作用。从练习的角度来看,单例集的 impl 是错误的。提示:singletonSet 应该使用手头的函数定义来实现:Int => Boolean
  • 这确实来自 Coursera 上的“Scala 函数式编程”课程。感谢您的提示;)

标签: scala functional-programming


【解决方案1】:

Scala 对类型和值有单独的命名空间。你的类型别名定义了Set在类型命名空间中是什么,但在singletonSet的定义中Set来自值命名空间,实际上它是伴随对象scala.collection.immutable.SetSet(element) 调用伴随对象的 apply 方法,该方法返回一个 scala.collection.immutable.Set[Int],它原来是 Int => Boolean 的子类型,因此也是 Set(您的类型别名)。

【讨论】:

  • 是的,就是这样。 Set(element) 创建scala.collection.immutable.Set[Int] 的实例。非常感谢大家帮助我!
猜你喜欢
  • 2013-10-19
  • 2014-11-04
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2016-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多