8

일부 기능에 대한 문자열 맵을 만드는 동안 예기치 않은 동작이 발생했습니다. 지도 요소로 부분 함수를 만들면 잘 동작합니다. val에 할당 할 때 대신 val을 호출합니다. 검사를 호출하려고하면 오류가 발생합니다. 예상 되나요? 나는 바보 같은 짓을하고 있니? 호출을 보려면 check()을 주석 처리하십시오. 나는 스칼라 당신이 메소드를 호출 빈 괄호를 생략 할 수 있습니다, 편의를 위해 스칼라 2.7.7스칼라 부분 함수가 부분 함수가 아닌 것은 언제입니까?

def PartialFunctionProblem() = { 
    def dream()() = { 
     println("~Dream~"); 
     new Exception().printStackTrace() 
    } 
    val map = scala.collection.mutable.HashMap[String,()=>Unit]() 
    map("dream") = dream()  // partial function 
    map("dream")()    // invokes as expected 
    val check = dream()   // unexpected invocation 
    check()      // error: check of type Unit does not take parameters 
} 
+0

도움 주셔서 감사합니다. 꿈() 호출을 꿈()으로 바꿨을 때 나는 예상대로 행동했다. PartialFunctions에 대해 더 자세히 읽어보고 용어를 오용하지 않도록하겠습니다. –

답변

12

를 사용하고 있지만, 그렇지 않은 그래서, 첫 번째 경우에 예상되는 형태가 ()=>Unit 것을 볼 수있을만큼 영리 너를위한 모든 괄호를 제거하라. 대신,이 메소드를 함수로 변환합니다.

그러나 val check의 경우 함수 호출 결과가 변수에 할당 된 것처럼 보입니다. 당신이 함수에 방법을 설정하려면이 인수 목록 (들) 대신에 방법 _을 배치

val check = dream 
val check = dream() 
val check = dream()() 

: 사실,이 모든 세 똑같은 일을. 따라서

val check = dream() _ 

원하는대로 할 수 있습니다.

5

글쎄, 문제는 당신이 그것을 잘못 알고 있다는 것입니다. :-)

는 몇 가지 개념적 실수이다 :

def dream()() = { 
    println("~Dream~"); 
    new Exception().printStackTrace() 
} 

이 부분 함수가 아니다. 이것은 Unit을 반환하는 두 개의 빈 매개 변수 목록이있는 카레 메서드입니다.

val map = scala.collection.mutable.HashMap[String,()=>Unit]() 

이지도의 값 유형은 부분 기능이 아니지만 기능입니다. 구체적으로는 Function0[Unit]입니다. 부분 함수의 유형은 PartialFunction[T, R]입니다. 여기 어떻게됩니까

map("dream") = dream()  // partial function 

스칼라 함수에 부분적으로 적용 변환 방법이다. 이것은 단순한 과제가 아닙니다. 타입 추론 기는 올바른 타입을 추측 할 수 있기 때문에 스칼라는 변환을 수행합니다.

val check = dream()   // unexpected invocation 

여기에는 유형 추정자가 도움이 될 것으로 예상되는 유형이 없습니다. 그러나 빈 매개 변수 목록은 생략 할 수 있기 때문에 이것은 단지 메서드 호출 일뿐입니다.

관련 문제