我想我仍然没有完全理解函数定义中的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 )
答案 0 :(得分:17)
()
根本不是类型,也不是值。 () =>
只是表示带零参数的函数的语法。请参阅the Scala specification.
当您看到(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节中描述。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页)