2012-01-20 65 views
4

我试图使用Y型组合子在Scala中定义GCD:斯卡拉:(INT,INT)=>内部不匹配(INT,INT)=>内部

object Main { 
    def y[A,B](f : (A => B) => A => B) : A => B = f(y(f)) 
    def gcd = y[(Int,Int),Int]((g) => (x,y) => if (x == 0) y else g(y % x, x)) 
} 

但我“M得到一个错误:

Main.scala:3: error: type mismatch;             
found : (Int, Int) => Int                
required: (Int, Int) => Int                
    def gcd = y[(Int,Int),Int]((g) => (x :Int,y :Int) => if (x == 0) y else g(y % x, x)) 
                ^

如果我讨好所有的参数,那么就没有问题:

def gcd = y[Int,Int => Int](g => x => y => if (x == 0) y else g(y % x)(x)) 

什么我在uncurried版本做错了什么?

+0

与你定义的参数'y'和'y'组合子有关吗? –

回答

7

该位与(g) => (x :Int,y :Int) =>。斯卡拉期待你的说法是(INT,INT)的元组,因此它会更喜欢(g) => (tup: (Int, Int)) =>

可以使用的比特模式匹配,以避免使用_1_2匹配的锤头。这对我来说编译得很好:

def gcd = y[(Int, Int), Int](g => { 
    case (x,y) => if(x == 0) y else g(y % x, x) 
}) 
+1

太棒了!这让它工作。我也想了解编译器在抱怨什么。你能帮助解释错误吗?什么时候元组不是元组? – rampion

+1

@rampion“什么时候元组不是元组?听起来像是一个很好的问题。错误符号肯定是不明确的。 –

+0

我同意这个错误是不明确的。也许我错过了一些东西,但是能够将元组作为参数列表来传递是件很酷的事,一个la'val x =(1,“hi”); def foo(a:Int,b:String)= ...; foo(x)' – Dylan

相关问题