如何干works的工作

时间:2015-09-20 11:54:14

标签: scala

我有以下参数列表功能:

def foo(a:Int, b:Int)(x:Int)(y:Int) = a * b + x - y

当我把命令放在relp

上时
foo _

它告诉我

res5: (Int, Int) => Int => (Int => Int) = <function2>

第一部分需要两个int参数然后我不知道如何继续读取。
我可以使用像

这样的功能
foo(5,5)(10)(10)

但我不知道如何阅读它!

2 个答案:

答案 0 :(得分:2)

通常,A =&gt; B是匿名函数的类型,当给出参数时 类型A,返回类型B的值。 现在,类型 (Int, Int) => Int => (Int => Int) 添加一些括号时可能看起来不那么混乱:

(Int, Int) => (Int => (Int => Int))

首先,将其分解为

(Int, Int) => (… => …)

即。给定两个Int的函数返回另一个函数。该 返回的函数具有类型

(Int => (Int => Int))

即。给定Int的函数返回另一个函数,给定一个Int, 返回一个Int。

答案 1 :(得分:1)

这很容易。 (Int,Int)=&gt; Int =&gt; (Int =&gt; Int)表示2个第一步返回一个带有一些参数的函数。例如:

(Int, Int) => Function that return
  (Int) => Function that return
    (Int) => Int

为什么有用?因为当你有一个函数将函数作为参数列表的参数时,你可以省略括号并使用花括号。

def someFunStuff(fun: Int)(stuff: Int => Int) = {
  fun*stuff(fun)
}

someFunStuff(2) { x =>
  //Do some fun stuff
  x * 2 / x
}

如果您想了解更多信息,请阅读Scala第二版中的第9.4章编程。