弱问一个=>运算符的问题
shivawu
2010-03-02
书上说凡是以:结尾的运算符是右结合,但是=>这个运算符好像也是右结合的吧。
Int => Int => Int 应该是 Int => (Int => Int)? 而且这个运算符的优先级是什么呢? |
|
night_stalker
2010-03-02
是右结合的:
scala> val f: (Int => Int => Int) = (a) => (b) => a + b f: (Int) => (Int) => Int = <function1> scala> f(3)(5) res0: Int = 8 |
|
yangzhan
2010-03-03
弱弱的问一句,假如是左结合的,结果应该是多少?
一直对=>不是很理解,盼指教 |
|
night_stalker
2010-03-03
=> 在作类型运算符时(注意,一般的 + - * / 大部分是值运算符)
假设是左结合的, Int => Int => Int 就相当于 (Int => Int) => Int 类型为 (Int => Int) => Int 的东西接受一个 lambda: (Int => Int) 作为参数,返回值类型为 Int。 scala> val f: ((Int => Int) => Int) = _(5) f: ((Int) => Int) => Int = <function1> scala> f(3 + _) res1: Int = 8 scala> f(3) <console>:6: error: type mismatch; found : Int(3) required: (Int) => Int f(3) ^ 但从下面的测试可以看到 ((Int => Int) => Int) 和 (Int => Int => Int) 不是一个类型: scala> val f: ((Int => Int) => Int) = _(5) f: ((Int) => Int) => Int = <function1> scala> val f: (Int => Int => Int) = _(5) <console>:4: error: x$1 of type Int does not take parameters val f: (Int => Int => Int) = _(5) ^ |
|
yangzhan
2010-03-03
非常感谢!
不过俺还是没明白上面代码的意思,俺还是打点相关资料看看:) |
|
小豆冰
2010-03-03
是右结合的.
val f: (Int => Int => Int) 可以写成 val f: (Int => (Int => Int)) 不要用OO思维,你用Currying就好理解了。该函数有一个参数,返回一个函数。所以该函数即使有再多参数,都可以看作函数递归。在Haskell里写作 f:: Int -> Int -> Int |
|
小豆冰
2010-03-03
object Currying {
val f: (Int => Int => Int) = (a) => (b) => a + b val e: (Int => (Int => Int)) = f def d(i:Int): (Int => Int) = f (i); def b(i: Int => Int):Int = i(1); def a: ((Int => Int) => Int) = b; } 从这个例子你可以看到 f 可以看作带一个参数的函数递归, 而 a 则是带一个函数参数的函数。 |
|
wolfman.hu
2010-03-05
去投票吧,可以向总理提问,关系我们网站现存问题的--备案, http://act3.news.qq.com/news/749/show.php?id=207737
|