2011-09-21 3 views
42

Scala composeandThen 방법에 대한 설명은 Pattern matching & functional composition입니다. 이러한 예는있다 :작성 및 수정 방법

scala> def addUmm(x: String) = x + " umm" 
scala> def addAhem(x: String) = x + " ahem" 

val ummThenAhem = addAhem(_).compose(addUmm(_)) 

내가 오류 얻을 그것을 사용하려고하면 :

<console>:7: error: missing parameter type for expanded function ((x$1) => addAhem(x$1).compose(((x$2) => addUmm(x$2)))) 
    val ummThenAhem = addAhem(_).compose(addUmm(_)) 
          ^
<console>:7: error: missing parameter type for expanded function ((x$2) => addUmm(x$2)) 
    val ummThenAhem = addAhem(_).compose(addUmm(_)) 
              ^
<console>:7: error: type mismatch; 
found : java.lang.String 
required: Int 
    val ummThenAhem = addAhem(_).compose(addUmm(_)) 

그러나,이 작품을 :

val ummThenAhem = addAhem _ compose addUmm _ 

또는

val ummThenAhem = addAhem _ compose addUmm 

튜토리얼의 코드에 어떤 문제가 있습니까? 후자의 표현은 괄호가없는 첫 번째 표현과 동일하지 않습니까? compose 문서에서

답변

38

addAhem을 치료하기 위해

scala> val ummThenAhem = (addAhem _).compose(addUmm _) 
ummThenAhem: String => java.lang.String = <function1> 

작성해야 방법입니다. compose 메서드는 함수에 정의됩니다. addAhem _addAhem을 메서드에서 함수로 변환하므로 compose을 호출 할 수 있습니다. compose은 함수를 인수로 기대합니다. 당신은 addUmmaddUmm 함수로 변환하여 addUmm _ (컴파일러는 함수가 어쨌든 기대되는 것을 알 때 함수를 함수로 자동 변환 할 수 있기 때문에 밑줄을 생략 할 수 있습니다)로 변환하여이 메서드를 제공합니다. 그래서 코드 :

addAhem _ compose addUmm 

(addAhem _).compose(addUmm) 

과 동일하지만

addAhem(_).compose(addUmm(_)) 

PS 난 당신이 제공된 링크에서 보이지 않았다이다.

+0

는 andThen 예 보인다 같은 :.. '발 ahemThenUmm = addAhem (_) andThen (addUmm (_))' 가 '발 ahemThenUmm1 = (addAhem _) andThen과 같아야합니다 (addUmm)' –

+0

나는 둥근 괄호 안에 쓰여진 부분에 대해서는 그렇게 확신하지 못한다; 컴파일러 *는 적어도 스칼라 2.10.2에서는 자동으로 함수를 변환하지 않습니다. 해결 방법은'addAhem'과'addUmm'을 함수로 선언하여'compose' 나'andThen'가'_'없이 작동하도록하는 것입니다. –

5

:

Composes two instances of Function1 in a new Function1, with this function applied last.

그래서 당신은 addAhemaddUmm 부분적으로 적용 기능 (즉 function1)

scala> addAhem _ 
res0: String => java.lang.String = <function1> 
2

이 튜토리얼은 이전 버전의 스칼라 (아마도 2.7.7 이하) 용으로 작성된 것 같습니다. 컴파일러에 약간의 변화가 있었다 그 이후, 즉, 이제 형 추론이 실패하는 원인이 타입 시스템에 확장명 기타 :

addUhum(_).compose(addAhem(_)) 

함수에 리프팅 아직도 그 구문을 작동하면 경우 단지 쓰기 :

addUhum(_) 
45

을 음,이 :

addUhum _ 

는 ETA의 확장이다. 메서드를 함수로 변환합니다.다른 한편,이 :

addUhum(_) 

은 익명의 기능입니다. 사실,이 매개 변수가 적용되지 않으며 전체가 함수로 변환된다는 점에서 부분 함수 응용 프로그램입니다. 기본적으로, 함수가 안쪽 식 구분 기호에서 "시작"할 것이다,

x => addUhum(x) 

확장을위한 정확한 규칙을 설명하기 조금 어려운,하지만 : 그것은에 확장합니다. 예외는 매개 변수 대신 _이 사용되는 경우 "x"가 함수 외부로 이동되는 부분 함수 응용 프로그램입니다.

val ummThenAhem = x => addAhem(x).compose(y => addUmm(y)) 

아아이 유형의 inferencer가 X 또는 Y의 유형을 알고하지 않습니다

어쨌든, 이것은 확장 방법이다. 원하는 경우 -Ytyper-debug 매개 변수를 사용하여 정확히 무엇을 시도했는지 확인할 수 있습니다. 완전성을 위하여