弱问一个=>运算符的问题

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
Global site tag (gtag.js) - Google Analytics