难以理解函数语法

时间:2013-01-20 23:01:05

标签: scala

我能理解这一点:

scala> def f(i: Int) = "dude: " + i
f: (i: Int)java.lang.String

scala> f(3)
res30: java.lang.String = dude: 3

它定义了一个函数f,它接受一个int并返回一个dude形式的字符串:+传入的int。

现在可以像这样指定相同的功能:

val f: Int => String = x => "dude: " + x
scala> f(3)
res31: String = dude: 3
  • 为什么我们需要两个=>
  • String = x是什么意思?我想当你想在Scala中定义一些东西时,你会做x:String

3 个答案:

答案 0 :(得分:10)

您应该将其解析为

val (f: Int => String) = (x => "dude: " + x)

因此它指定f具有类型(Int => String)并且被定义为匿名函数,该函数接受Int参数(x)并返回String

答案 1 :(得分:6)

只是澄清了一下。 def语句定义方法,而不是函数。

现在,为了这个功能。你可以这样写:

val f: (Int => String) = x => "dude: " + x

它可以被读作“f是从Int到String的函数”。因此,回答您的问题时,类型位置中的=>表示从类型到类型的函数,而值位置中的=>表示参数identifier并返回expression。< / p>

此外,它还可以依赖类型推导者:

val f = (x:Int) => "dude: " + x

答案 2 :(得分:3)

Lee和pedrofurla都给出了很好的答案。我还要补充一点,如果你想将你的方法转换为一个函数(作为参数传递,用作部分应用的函数等),你可以使用神奇的下划线:

def foo(i: Int) = "dude: " + x
val bar = foo _  // now you have a function bar of type Int => String