何时在定义curried函数时拆分参数

时间:2013-04-01 21:13:11

标签: scala currying

所有这些功能都做同样的事情:

def h0(f: Int => Int)(g: Int => Int)(x: Int) = f(g(x))
def h1(f: Int => Int, g: Int => Int)(x: Int) = f(g(x))
def h2(f: Int => Int)(g: Int => Int, x: Int) = f(g(x))
def h3(f: Int => Int, g: Int => Int, x: Int) = f(g(x))

现在我处于多元困境中:我应该在哪种情况下“分裂”论点?

1 个答案:

答案 0 :(得分:3)

拆分参数对于类型推断是很有用的(因为编译器会从左到右一次一个地查看它们,所以你可以修复左边的类型而不会陷入右边的混乱 - 但缺点是如果你在完全推断它之前引用泛型类型,那么当你点击下一个参数块时,你就会遇到部分进展),并且允许使用大括号而不是括号。所以,如果你想要像

这样的语法
h0{ i =>
  math.round(math.pow(0.9123751,-i)).toInt
}{ j =>
  (10*math.sin(j)).toInt
}(2)

然后你应该像h0中那样分开。否则,您可以做任何有意义的事情以获得最大的清晰度特别是,上面的h2是不好的,因为它没有明显的原因对gx进行分组。根据具体情况,任何其他人都可以。