2011-09-12 5 views
3

나는이Tupled 함수의 합성

let f = (fun a b -> a, b) >> obj.Equals 

라는 이름의 액세스 가능한 구성원 또는 객체 생성자의 1 개 인자

하지만,이 일을한다 '같음 없다'는 오류를 제공하는 이유 궁금

let f = (fun a -> a, a) >> obj.Equals 
+1

내가 오류 메시지 그게 _This 인 때 표현식은'a -> 'b *'a' 유형을 가질 것으로 예상되었지만 여기에는''c * 'd'_ 유형이 있습니다. 이것은 조금 더 유익합니다. 그것은 kvb이 그의 좋은 대답에서 쓴 것에 더 분명하게 일치합니다. 왜 다른 메시지를 받는지 잘 모르겠다. –

답변

3

유형을 고려하십시오. (>>)('a -> 'b) ->('b -> 'c) -> ('a -> 'c) 유형이지만, 'a -> ('b -> 'a*'b)obj * obj -> bool 유형의 인수를 사용하여 호출하려고합니다. 이러한 인수는 이와 같이 적합하지 않습니다.

당신은 물론 바이너리 및 단항 기능을 구성하기위한 새로운 콤비를 정의 할 수 있습니다 : 당신이 당신의 예를 대신 (>>)에서 사용할 수 있습니다

let (>>*) f g a b = f a b |> g 

하는 경우.

+0

Ah. ''''첫 번째 인자가 단항 적이라는 것을 간과했습니다. 그 이상한 오류 메시지 (나는 아직도 받고있다)가 나를 내쫓고 있었다. 감사. – Daniel

6
새로운 콤비 연산자를 정의하지 않고

:

let f = (fun a b -> a, b) >> (<<) obj.Equals 

>> (<<) 멋진 트릭을, 또한 더 인수를 연장 할 수 있습니다

let compose3 f g = f >> (<<) ((<<) g) 
val compose3 : ('a -> 'b -> 'c -> 'd) -> ('d -> 'e) -> ('a -> 'b -> 'c -> 'e) 
+0

+1 깔끔한 트릭입니다! – Daniel