Scala ()=>;之间的区别是什么;整数和单位=>;智力?究竟什么类型的「;()";在斯卡拉?

Scala ()=>;之间的区别是什么;整数和单位=>;智力?究竟什么类型的「;()";在斯卡拉?,scala,Scala,我想我还没有完全理解在函数定义过程中类型()代表什么。所以我不能给出每种情况的具体例子:()=>Int;单位=>Int 有人能给我一个简单的例子,分别是type()=>Int和type Unit=>Int的函数literal吗?在那之后,我想我可以知道()到底是什么 谢谢 *编辑:*destin说他们是一样的。但下面的测试似乎表明情况并非如此:()不能在预期单元中使用 scala> def inCase[A] ( b :Boolean, ifTrue : Unit => A, ifF

我想我还没有完全理解在函数定义过程中类型()代表什么。所以我不能给出每种情况的具体例子:()=>Int;单位=>Int

有人能给我一个简单的例子,分别是type()=>Int和type Unit=>Int的函数literal吗?在那之后,我想我可以知道()到底是什么

谢谢

*编辑:*destin说他们是一样的。但下面的测试似乎表明情况并非如此:()不能在预期单元中使用

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 )
scala>def inCase[A](b:Boolean,如果真:单位=>A,如果假:单位=>A):A=
|b比赛{
|大小写为True=>ifTrue()
|案例=>ifFalse()
|     }
例如:[A](b:Boolean,如果真:单位=>A,如果假:单位=>A)A
scala>inCase(True,()=>1,()=>1)
:11:错误:类型不匹配;
找到:()=>Int
必需:单位=>?
例如(True,()=>1,()=>-1)
函数类型中的
()
根本不是类型,也不是值
()=>
是一种简单的语法,用于指示接受零参数的函数。参见本规范第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
    

    foo我更改了您的示例,使其同时具有两种符号(并使用更流行的布尔值):

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

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

    编辑

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

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


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

    您在寻找int或Unit的返回类型吗?听起来像,但我想确定一下。我正在寻找Int.No的返回类型
    ()=>Int
    表示不带参数并返回Int的函数。您的引用是正确的,但与主题无关。在函数的类型签名中,
    ()
    表示没有映射到函数0的参数。如果定义
    valf:()=>Int=()=>12,然后用一个单位参数调用它,它将不起作用:尝试
    f()
    f(())
    {valf:unit=>Int=((x:unit)=>42);f(())
    的计算结果为42<代码>{val g:()=>Int=(()=>42);g()}
    计算结果为42。但奇怪的是,
    {valh:Unit=>Int=((x:Unit)=>42);h()}
    也编译并计算为42。我会认为,由于我传递了h零参数而不是一个,这将是一个编译时错误。而且,有趣的是,
    {val k:Int=>Int=((a:Int)=>42);k()}
    给出了一个“没有足够的参数用于方法应用”,而不是一个类型错误。因此,似乎有一种特殊情况,将0个参数传递给域为
    Unit
    的1个参数函数。
    def inCase[A] (b:Boolean, ifTrue: ()=> A, ifFalse: Unit => A): A = b match {
      case true => ifTrue ()
      case _    => ifFalse ()
    }
    
    inCase (true, () => 1,  (Unit) => -1)
    
    def swap(i: Int, j: Int): Unit = {
      val t = xs(i); xs(i) = xs(j); xs(j) = t
      ()
    }