scala - 代表采用按名称参数的函数的函数特征是什么?

标签 scala

Scala 中的函数是实现 FunctionN 之一的对象。性状。例如:

scala> def f(x: Int) = x * x
f: (x: Int)Int

scala> val ff = f _
ff: Int => Int = <function1>

scala> val fff: Function1[Int, Int] = f _
fff: Int => Int = <function1>

到现在为止还挺好。但是,如果我们有一个接受按名称参数的函数呢?它当然仍然实现了 FunctionN 之一特点:
scala> def g(x: => Int) = x * x
g: (x: => Int)Int

scala> val gg = g _
gg: => Int => Int = <function1>

scala> gg.isInstanceOf[Function1[_, _]]
res0: Boolean = true

但它到底是什么类型?不是Function1[Int, Int] :
scala> val ggg: Function1[Int, Int] = g _
<console>:8: error: type mismatch;
 found   : => Int => Int
 required: Int => Int
       val ggg: Function1[Int, Int] = g _
                                      ^

也不是Function1[Function0[Int], Int] :
scala> val ggg: Function1[Function0[Int], Int] = g _
<console>:8: error: type mismatch;
 found   : => Int => Int
 required: () => Int => Int
       val ggg: Function1[Function0[Int], Int] = g _
                                                 ^

Function1[=> Int, Int]无法编译:
scala> val ggg: Function1[=> Int, Int] = g _
<console>:1: error: identifier expected but '=>' found.
       val ggg: Function1[=> Int, Int] = g _
                          ^

那是什么?

最佳答案

By-name 非常有用,但在类型系统之外是不安全的

Scala 按名称参数是一种语法糖,可在需要延迟评估时使代码更具可读性。没有它,我们需要在所有需要懒惰的东西前面加上“() =>”。也就是说,虽然它在运行时只是一个 function0,但如果您可以将参数以外的任何内容定义为具有按名称类型,那么在类型系统级别就会出现问题。还要记住,FunctionN 特性主要用于实现和 Java 互操作性,因为在 Java 和 JVM 中没有函数类型这样的东西。

露骨

如果您确实需要在输入中明确表示,以下内容将使您受到限制

def g(x: => Int) = x * x
val ggg: (=> Int) => Int = g _

更复杂的打字

按名称类型只能在函数类型声明的参数部分内使用。然后可以在其他参数化类型中使用函数类型本身。
var funks: List[(=> Int) => Int] = Nil
funks ::= ggg
funks foreach { _ { println("hi"); 5 } }

关于scala - 代表采用按名称参数的函数的函数特征是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8250939/

相关文章:

Scala:如果在匹配案例中

java - Scala:ArrayBuffer/ArrayList 的 Json 表示...如何避免打印出集合中的空信息?

scala - Scala 代码究竟在什么时候执行堆分配?

scala - 如何在 Scala 中展平一组数组?

scala - def没有参数

scala - 玩! dist 抛出异常

scala - Scala 中的哪些功能/特性仅作为对底层平台的让步而存在,如果针对其他目标应该删除?

scala - scala 中的字符串连接是否与 Java 中一样 coSTLy?

scala - 是否应该使用效果类型来建模有状态对象?

http - 如何在 Spray 框架中获取传入 IP 地址