2012-01-20 8 views
4

내가 스칼라에서 GCD를 정의하기 위해 Y-콤비를 사용하기 위해 노력하고있어 일치하지 않습니다스칼라 (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) =>입니다. 스칼라는 인수 (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

관련 문제