类型Set = Int =>的含义Scala中的布尔值

时间:2014-03-16 16:51:48

标签: scala

我不明白为什么以这种方式定义Set会产生这些结果。

我的理解是Set只是一个接受int并返回布尔值的函数。

有人可以解释一下为什么我使用set得到这个结果吗?

我认为这是在Scala中表达函数的一种简短方法,但我是这种语言的新手,我不明白它是如何工作的。

object sets {
  type Set = Int => Boolean

    var a=Set(3)                              //> a  : scala.collection.immutable.Set[Int] = Set(3)
    a(2)                                      //> res0: Boolean = false
    a(3)                                      //> res1: Boolean = true
    a(1)                                      //> res2: Boolean = false
}

2 个答案:

答案 0 :(得分:11)

您在type Set = Int => Boolean中定义的类型以及您在var a=Set(3)中创建的对象实际上未相互连接。即便如此:

scala> type Set = String
defined type alias Set

scala> val a = Set(3)
a: scala.collection.immutable.Set[Int] = Set(3)

当您致电Set(3)时,请在object Set上调用apply方法。如果您添加new关键字,则会考虑您的类型别名:

scala> val b = new Set()
b: String = ""

a(2)a(3)a(1)有效,因为Set[A]实际上确实实现了A => Boolean功能特性,而apply方法等同于{ {1}}:http://www.scala-lang.org/api/2.10.3/index.html#scala.collection.immutable.Set

答案 1 :(得分:2)

我同意izstas所说的不同之处。但是"输入Set = Int =>布尔"有效果。在scala控制台的以下步骤中,在"之后键入Set = Int =>布尔"错误消失了。

scala> def func(s:Set) = 1
<console>:10: error: type Set takes type parameters
       def func(s:Set) = 1
                  ^

scala> def func(s:Set[Int]) = 1
func: (s: Set[Int])Int                      <---- specify the type in the set

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

scala> def func(s:Set) = 1                   <---- no error
func: (s: Set)Int

scala> def getSet(s:Set) = s
getSet: (s: Set)Set

scala> getSet(Set(1,2))
res0: Set = Set(1, 2)

scala> Set(1,2)
res1: scala.collection.immutable.Set[Int] = Set(1, 2)

scala> val t=Set(1,2)
t: scala.collection.immutable.Set[Int] = Set(1, 2)