scala
2013-07-23 2 views 1 likes 
1

스칼라의 compose 함수를 작성하려고하면 컴파일 타임 오류가 발생합니다.스칼라의 작성을 처음부터 작성하기

val compose = (a: Double => Double, b: Double => Double) = b(a)

": 1 : 오류 : ';' 예상되지만 '='발견 됨 val comp = (a : Double => Double, b : Double => Double) = b (a) "

이 함수는 어떻게 작성됩니까?

답변

0

매우주의하십시오. 현재 상태에서 정의에 대한 두 가지 문제가 있습니다.

첫 번째 예외는보고있는 예외를 생성합니다. 당신은 실제로 b(a) 이전 대입 연산자를 원하지 않는다, 당신이 당신의 익명 함수의 몸체가되고 싶어요, 그래서 당신이 => 조작해야합니다 : 그러나

val compose = (a: Double => Double, b: Double => Double) => b(a)

을, 당신은 아직 안 끝났어 . 컴파일러는 당신이하고있는 생각하는지 몸 b(a)에서 매개 변수로 a으로 보내고 B apply, 그래서 당신이 얻을 : 당신이 볼 수 있듯이

<console>:7: error: type mismatch; 
found : Double => Double 
required: Double 
    val compose = (a: Double => Double, b: Double => Double) => b(a) 

는, Double를 취할 b 기대,하지만 당신을 인수로/Function1[Double, Doublea을 전달합니다.

은 그래서 당신이보고있는 것을보고있다 왜, 당신은 다음 단계에서 볼 수있을거야,하지만 난 꽤 compose를 작성하는 방법에 대답하는 방법을 스스로 완전히 확실하지 않다. 당신은 compose에 매개 변수를 추가하여 약간 속이 수 있습니다

scala> val compose = (a: Double => Double, b: Double => Double, c: Double) => b(a(c)); 
compose: (Double => Double, Double => Double, Double) => Double = <function3> 

scala> compose(x => x * 2, y => y * 2, 2) 
res2: Double = 8.0 

하지만 그 바람을 피우고.

2

당신은 컴파일러에게 더 많은 종류의 정보를 제공해야합니다

val compose: (Double => Double, Double => Double) => (Double => Double) = (a, b) => (x => b(a(x))) 

scala> val dd1: Double => Double = x => x + x 
dd1: Double => Double = <function1> 

scala> val dd2: Double => Double = x => x * x 
dd2: Double => Double = <function1> 

scala> val DD1 = compose(dd1, dd2) 
DD1: Double => Double = <function1> 

scala> val DD2 = compose(dd2, dd1) 
DD2: Double => Double = <function1> 

scala> DD1(2) 
res0: Double = 16.0 

scala> DD2(2) 
res1: Double = 8.0 
2

=>와 마지막 =를 교체합니다. => 기호는 값 위치에있을 때 인수를 함수의 구현과 구분합니다.

함수 작성 내용을 선언했지만 반환 할 내용을 선언하지 마십시오. 그래서 당신이 원하는 것이 확실하지 않습니다. 여기에는 두 가지 가능성이 있습니다.

당신은 값에 적용되는 구성의 결과를 할 수 있습니다,이 경우이 값이 필요합니다 :

scala> val compose = (a: Double => Double, b: Double => Double, arg:Double) => b(a(arg)) 
compose: (Double => Double, Double => Double, Double) => Double = <function3> 

그것은 두 가지 기능을한다 그들을을 구성하고 arg을 적용합니다.

또한 두 가지 기능의 구성에 의해 생성 된 기능을 할 수 있습니다 : 우리가 대신 기능 3과 인수의 첫 번째 집합 후 반환하는 기능 2을 가지고 지금

scala> val compose = (a: Double => Double, b: Double => Double) => 
    { x:Double =>b(a(x)) } 
compose: (Double => Double, Double => Double) => Double => Double = <function2> 

주의는 또 다른 기능입니다 .여기에 문제의

val compose: (Double => Double, Double => Double) => Double => Double = 
    (a,b) => { x => b(a(x)) } 

하나 타입 위치에 =>의 사용이 값 위치에있는 그것의 사용보다 약간 다른 점이다

우리는 다르게 조금을 할 수 있습니다. 값의 위치에는 인수 이름이 있어야하며이 인수의 유형 주석은 스칼라 유추에 대한 힌트이며 유추가 선언되어 반환을 선언 할 수 없습니다. 그러므로, 당신이 원하는 것에 대한 나의 의심.

관련 문제