我有这个方法签名:
def fold[B](startValue: A): ((A, A) => B) => B
IntelliJ告诉我,不需要在lamba表达式中加上括号,并且签名可以写为:
def fold[B](startValue: A): (A, A) => B => B
这是真的吗?我了解到我们具有右手关联性,这意味着
def fold[B](startValue: A): (A, A) => B => B
与
相同def fold[B](startValue: A): (A, A) => (B => B)
但是,在我看来,这与我在第一个签名中所表达的并不相同。我想fold
:
返回一个函数x,该函数使用具有两个类型A的参数的函数y并返回类型B的值。我还希望函数x返回类型B的值。
但是最后一个签名似乎表明了这一点:
返回一个带有两个类型为A的参数的函数x,然后返回另一个带有一个B类型的参数并返回一个B值的函数y。
这显然不是我想要的!在第一种情况下,函数x返回一个值。在第二个中,它返回一个函数。
IntelliJ在这里真的错了吗?
上下文:
abstract class MyList[+A] {
def fold[B](startValue: B): ((A, A) => B) => B
}
答案 0 :(得分:1)
编辑:正如@JoelBerkeley所注意到的那样,在scala repl中定义这种方法会导致您所描述的预期行为,所以您是正确的。
但是从我检查intellij的内容来看,没有这样的建议出现。我正在使用版本18.5.3和用于scala的官方插件。也许您的ide配置不是最新的?