복붙노트

[SCALA] 여러 매개 변수를 폐쇄 인수 유형을 추론하지

SCALA

여러 매개 변수를 폐쇄 인수 유형을 추론하지

난 내가 원하는 방식으로 행동 얻을 수없는 코드의 조각이있다. 나는 (이를 위해 옷을 벗었) 다음과 같은 방법으로 정의 된 클래스가 :

class Behaviour[T](private val rule: Time => T) {
  def map1[U, V](behaviour: Behaviour[U], func: (T, U) => V): Behaviour[V] = {
    new Behaviour(time => func(this.at(time), behaviour.at(time)))
  }
}

이 클래스와 놀아 때 나는 사소한 것이라고 생각하는 것이 무엇인가를 시도했다 :

val beh = Behaviour(time => 5)
val beh2 = Behaviour(time => 5)
beh.map1(beh2, (a, b) => a + b)

마지막 줄을 위해 나는 다음과 같은 오류가 나타날 수 있습니다 :

<console>:13: error: missing parameter type
          beh.map1(beh2, (a, b) => a + b)
                             ^

나는 물론 폐쇄 매개 변수 유형을 지정할 수 있으며 제대로 작동하지만 왜 여기 추론 작업을 입력하지 않는 이유는 무엇입니까? 물론 나는 또한 기능 (두 솔루션은 아래 참조) 일반 유형을 지정할 수 있습니다.

나는 스칼라는 추론 유형에 '스캔'을 수행하고 beh2을보고 함수에 전달하고 지능으로 여기에 U 가정 거라 생각 했어요. 나는이 문제를 해결하지 않고 (폐쇄 또는 제네릭) 입력 매개 변수의 유형을 지정할 수있는 방법이 있습니까?

편집 :이 수정의 예는 내가 가진 :

beh.map1[Int, Int](beh2, (a, b) => a + b)
beh.map1(beh2, (a, b : Int) => a + b)

해결법

  1. ==============================

    1.여기에 무슨 일이 일어나고 있는지에 대한 설명이 스칼라 - 토론 스레드를 참조하십시오. 문제는 스칼라의 타입 추론이 아닌 매개 변수 당, 매개 변수 목록에 따라 발생하는 것입니다.

    여기에 무슨 일이 일어나고 있는지에 대한 설명이 스칼라 - 토론 스레드를 참조하십시오. 문제는 스칼라의 타입 추론이 아닌 매개 변수 당, 매개 변수 목록에 따라 발생하는 것입니다.

    조쉬 Suereth 그 스레드에서 지적 된 바와 같이, 현재의 접근 방식에 대한 좋은 이유가있다. 스칼라는 당 매개 변수 타입 추론이 있다면, 컴파일러는 같은 매개 변수 목록에서 상위 유형에 걸쳐 구속을 추론 할 수 없었다. 다음을 고려하세요:

    trait X
    class Y extends X
    class Z extends X
    
    val y = new Y
    val z = new Z
    
    def f[A](a: A, b: A): (A, A) = (a, b)
    def g[A](a: A)(b: A): (A, A) = (a, b)
    

    F는 (Y는 Z) 우리가 기대하지만, g (y)의 (Z)는 컴파일러 이미 A.의 형태로서 Y를 선택 년대 초 인수 목록을 얻는 시간 이후 형식 불일치를 제공 정확히 작동

  2. ==============================

    2.이 문제를 해결하는 방법 중 하나는 여러 인수 목록을 정의하는 것입니다. 그래서 MAP1 방법은 다음과 같이 정의된다 :

    이 문제를 해결하는 방법 중 하나는 여러 인수 목록을 정의하는 것입니다. 그래서 MAP1 방법은 다음과 같이 정의된다 :

    def map1[U, V](behaviour: Behaviour[U])(func: (T, U) => V): Behaviour[V] = ...
    

    당신은 다음과 같이 사용할 수 있습니다 :

    beh.map1(beh2)((a, b) => a + b)
    beh.map1(beh2)(_ + _)
    

    나는 완전히 확실 타입 추론이 경우에는 작동하지 않는 이유를 모르겠지만, 나는 그것이 U 유형 매개 변수의 사용과 함께 할 수있는 뭔가가 있다고 생각합니다. 당신은 두 번 사용 - 제 1 및 제 2 인수에 대해. 아마도 너무 그것을 알아 내기 위해 컴파일러 복잡. 2 개 인자 목록의 경우, U는 첫 번째 인수리스트를 컴파일하는 동안 유추 할 것이고, 두 번째 인수 목록이 이미 추론 유형을 사용합니다.

  3. from https://stackoverflow.com/questions/9118264/multiple-parameter-closure-argument-type-not-inferred by cc-by-sa and MIT license