12

我想我仍然没有完全理解在函数定义过程中 type () 代表什么。所以我无法提出每种情况的具体例子: () => Int; 单位=> 诠释。

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

谢谢

*编辑:* destin 说它们是一样的。但以下测试似乎表明并非如此: () 不能用于期望 Unit.

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 )
4

3 回答 3

17

()在函数中,类型根本不是类型,也不是值。() =>是简单的语法来指示一个接受零参数的函数。请参阅Scala 规范第 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 节)。如果它们不为空,您会得到一个TupleNwhereN是括号内的值的数量。如果它们为空,则此表达式的类型为Unit。(第 6.9、12.2.3 节)
于 2012-05-29T02:07:07.940 回答
1

我更改了您的示例,使其具有两种表示法(并使用更流行的布尔值):

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

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

然后我必须在调用站点上使用相同的符号。

于 2012-05-29T02:20:30.443 回答
-1

()是 type 的唯一实例Unit
因此() => Int,部分函数的签名意味着:获取Unit对象,做某事并给出一个 Int。
Unit => Int意思是:接受任何Unit 对象,做某事并给出一个 Int。

编辑

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

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

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

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

于 2012-05-29T06:28:16.433 回答