3

我可以理解这一点:

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什么?
4

3 回答 3

10

您应该将其解析为

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

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

于 2013-01-20T23:07:17.510 回答
6

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

现在,对于功能。你可以这样写:

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

它可以读作“f 是从 Int 到 String 的函数”。所以,回答你的问题,=>在类型位置意味着函数从类型到类型,而=>在值位置意味着接受参数identifier并返回expression

此外,它还可以依赖于类型推断器:

val f = (x:Int) => "dude: " + x
于 2013-01-20T23:27:41.973 回答
3

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

def foo(i: Int) = "dude: " + x
val bar = foo _  // now you have a function bar of type Int => String
于 2013-01-21T02:24:24.023 回答