()=>之间有什么区别? Int和Unit =>诠释?什么是Scala中的“()”类型?

时间:2012-05-29 01:16:58

标签: scala

我想我仍然没有完全理解函数定义中的type()表示。所以我不能提出每个案例的具体例子:()=>诠释;单位=>中间体

有人可以给我一个简单的函数文字示例,类型为()=> Int和type Unit => Int分别?在那之后,我想我可以了解究竟是什么()。

由于

* 编辑:* 目的地说他们是一样的。但是下面的测试似乎表明不然:()不能用到期望单位。

scala> def inCase[A] ( b :Boolean, ifTrue : Unit => A, ifFalse : Unit => A ) : A  = 
 |     b match {
 |         case True => ifTrue()
 |         case _ => ifFalse()
 |     }

 inCase: [A](b: Boolean, ifTrue: Unit => A, ifFalse: Unit => A)A


scala> inCase( True,  () => 1,  () => -1 )
 <console>:11: error: type mismatch;
 found   : () => Int
  required: Unit => ?
          inCase( True,  () => 1,  () => -1 )

3 个答案:

答案 0 :(得分:17)

函数类型中的

()根本不是类型,也不是值。 () =>只是表示带零参数的函数的语法。请参阅the Scala specification.

的第3.2.9节中的BNF表示法

当您看到(Type1, Type2, Type3) => Type4时,()会围绕该函数所采用的所有参数类型。 (Type1, Type2, Type3)这里不是元组类型 - 括号只是语法。因此,当您看到() => Type4时,您有一个参数列表,其中包含零参数。单个参数函数是特殊的,因为您可以省略括号。

没有参数的函数,没有(),只是=> Type4指定的是名称参数(看起来像值,但是实现为当你试图评估它们的值时隐式调用的函数。)它们在规范的第4.6.1节中定义。

括号在其他情境中可能意味着其他一些东西。

  • 函数类型声明中的括号在=>之前的任何位置指示元组类型,并且这些括号不能为空。 (第3.2.5节)
  • 空括号()是返回类型为Unit的函数的返回值。 (第12.2.3节)这实际上在某些情况下变为真实值,例如println(println("foo"))将打印

    foo                 <--- the argument to the inner println
    ()                  <--- the argument to the outer println
    
  • 当你进行函数调用时,括号也是函数参数的语法,这是你可能已经意识到的。这些可能是空的。它们在规范的第6.6节中定义。

  • 当您使用def定义方法时,括号也是函数参数的语法。这些在规范的第4.6节中描述。​​
  • 括号也是创建元组值的语法(第6.9节)。如果它们不为空,则会得到TupleN,其中N是括号内的值的数量。如果它们为空,则此表达式的类型为Unit。 (第6.9节,第12.2.3节)

答案 1 :(得分:1)

我改变了你的例子,有两个符号(并使用更流行的布尔值):

def inCase[A] (b:Boolean, ifTrue: ()=> A, ifFalse: Unit => A): A = b match {
  case true => ifTrue ()
  case _    => ifFalse ()
}

inCase (true, () => 1,  (Unit) => -1)

然后我必须在呼叫站点上使用相同的表示法。

答案 2 :(得分:-1)

()Unit类型的唯一实例。
因此() => Int作为部分函数的签名意味着:取 单元对象,做某事并给出一个Int。
Unit => Int表示:接受任何单位对象,做某事并给出一个Int。

修改

“Scala的Unit类型大致对应于Java中的void;只要函数没有返回有趣的结果就会使用它。事实上,因为Scala是一种面向表达式的语言,所以每个函数都返回一些结果。如果没有显式返回给出表达式,假定值(),发音为“unit”。该值为 单位类型。单位返回函数也称为过程。这是一个更多 在第一个实现中,“面向表达式”交换函数的表达式 快速排序,使其明确:

def swap(i: Int, j: Int): Unit = {
  val t = xs(i); xs(i) = xs(j); xs(j) = t
  ()
}

此函数的结果值只是它的最后一个表达式 - 返回关键字是 不必要。请注意,返回显式值的函数始终需要“=” 在他们的身体或定义表达之前。“

来源:Scala编程 - Martin Odersky(第14页)