2012-01-20 16 views
4

私はScalaでGCDを定義するには、y-コンビネータを使用しようとしている:スカラ:(INT、INT)=> 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)) 
} 

しかし、私エラーを取得「メートル:

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

私はuncurriedバージョンで間違ってやっている何を:私はすべての引数をカレー場合

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)) 
                ^

、その後、全く問題ありませんか?

+0

あなたが定義した引数yとyコンビネータとは何か関係がありますか? –

答えて

7

ビットは(g) => (x :Int,y :Int) =>です。それはあなたがTUPに_1_2マッチングを使用する必要がないように、パターンマッチングのビットを使用することができ、よりなどの(g) => (tup: (Int, Int)) =>

になるので、Scalaは、あなたの引数が(INT、INT)のタプルであることを期待しています。

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 x val x =(1、 "hi"); def foo(a:Int、b:String)= ...; foo(x) ' – Dylan

関連する問題