如何使用显式返回类型定义Scala闭包

时间:2011-09-04 03:43:06

标签: scala closures

为什么这不适用于scala:

val cloz: (Int,String => String) = (num: Int, str: String) => {
    str+"-"+num
}

我看到一些闭包只用1个arg定义的例子,如下所示:

val thingy: (Int => Int) = (num: Int) => {
    num * 2
}

但绝对无处(包括Scala电子书)我能找到任何解释“val”闭包语法的信息。

谢谢! 杰米

2 个答案:

答案 0 :(得分:14)

正确的语法是:

val cloz: (Int, String) => String = (num: Int, str: String) => {
    str + "-" + num
}

顺便说一句,在这个简单的例子中,您还可以简化这样的表达式(特别是如果您已经明确指定了函数的类型):

val cloz: (Int, String) => String = (num, str) => str + "-" + num 

更新

您还可以使用REPL来探索Scala - 这是一个非常好的工具。您只需启动scala而无需任何参数即可启动它。这是示例会话:

scala> val cloz = (num: Int, str: String) => str + "-" + num
cloz: (Int, String) => java.lang.String = <function2>

scala> val cloz: (Int, String) => String = (num: Int, str: String) => {
     |     str + "-" + num
     | }
cloz: (Int, String) => String = <function2>

scala> val cloz: (Int, String) => String = (num, str) => str + "-" + num
cloz: (Int, String) => String = <function2>

scala> def printCloz(cloz: (Int, String) => String, num: Int, str: String) = print(cloz(num, str))
printCloz: (cloz: (Int, String) => String, num: Int, str: String)Unit

正如您所看到的,它不仅允许您以交互方式执行代码,还可以在您定义某些内容时打印类型信息。

答案 1 :(得分:0)

根据@Eazy Angel的优秀答案,我为那些和我一样困惑的人提供这个:

val cloz: (Int,String) => String = (num, str) => {
    str+"-"+num
}
def f1(  clozArg: ((Int,String) => String), intArg: Int, stringArg: String  ): String = {
    clozArg(intArg,stringArg)
}
println("f1 result="+f1(cloz, 5, "okee"))

但请注意(如果我错了请纠正我)scala类型推断的b / c你不需要明确指定所有这些类型。到目前为止我唯一一次看到你必须做的就是使用递归。

-
更新:
奇异语法也有效:(参见第3行的返回类型)

val cloz = (num: Int, str: String) => {
    str+"-"+num
} : String
def f1(  clozArg: ((Int,String) => String), intArg: Int, stringArg: String  ): String = {
    clozArg(intArg,stringArg)
}
println("f1 result="+f1(cloz, 5, "okee"))