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

che*_*hen 12 scala

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

有人能给我一个简单的函数文字示例,其中type()=> Int并分别键入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 )
Run Code Online (Sandbox Code Playgroud)

Ken*_*oom 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
    
    Run Code Online (Sandbox Code Playgroud)
  • 当你进行函数调用时,括号也是函数参数的语法,这是你可能已经意识到的.这些可能是空的.它们在规范的第6.6节中定义.

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