스칼라의 compose
함수를 작성하려고하면 컴파일 타임 오류가 발생합니다.스칼라의 작성을 처음부터 작성하기
val compose = (a: Double => Double, b: Double => Double) = b(a)
": 1 : 오류 : ';' 예상되지만 '='발견 됨 val comp = (a : Double => Double, b : Double => Double) = b (a) "
이 함수는 어떻게 작성됩니까?
스칼라의 compose
함수를 작성하려고하면 컴파일 타임 오류가 발생합니다.스칼라의 작성을 처음부터 작성하기
val compose = (a: Double => Double, b: Double => Double) = b(a)
": 1 : 오류 : ';' 예상되지만 '='발견 됨 val comp = (a : Double => Double, b : Double => Double) = b (a) "
이 함수는 어떻게 작성됩니까?
매우주의하십시오. 현재 상태에서 정의에 대한 두 가지 문제가 있습니다.
첫 번째 예외는보고있는 예외를 생성합니다. 당신은 실제로 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, Double
인 a
을 전달합니다.
은 그래서 당신이보고있는 것을보고있다 왜, 당신은 다음 단계에서 볼 수있을거야,하지만 난 꽤 이 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
하지만 그 바람을 피우고.
당신은 컴파일러에게 더 많은 종류의 정보를 제공해야합니다
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
가 =>
와 마지막 =
를 교체합니다. =>
기호는 값 위치에있을 때 인수를 함수의 구현과 구분합니다.
함수 작성 내용을 선언했지만 반환 할 내용을 선언하지 마십시오. 그래서 당신이 원하는 것이 확실하지 않습니다. 여기에는 두 가지 가능성이 있습니다.
당신은 값에 적용되는 구성의 결과를 할 수 있습니다,이 경우이 값이 필요합니다 :
는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)) }
하나 타입 위치에 =>
의 사용이 값 위치에있는 그것의 사용보다 약간 다른 점이다
우리는 다르게 조금을 할 수 있습니다. 값의 위치에는 인수 이름이 있어야하며이 인수의 유형 주석은 스칼라 유추에 대한 힌트이며 유추가 선언되어 반환을 선언 할 수 없습니다. 그러므로, 당신이 원하는 것에 대한 나의 의심.