2013-09-28 5 views
9

구성과 g기능의 구성 ( A B -> F (g가) (g 나))과 관련된 일반적인 패턴 F의

f :. g = \a b -> f (g a) (g b) 

내가 내 코드에서 매우 자주 찾을 패턴처럼 보인다. 단항 함수 구성과 유사합니다. f 만 이진이며, f에 전달되기 전에 두 인수에 모두 g을 적용해야합니다. 나는 지점이없는 형식이 변환 lambdabot을 물어 보면

, 나는 차라리 내 코드가없는 것 이상한 주문

을 얻을, 그래서 난 그냥 명시 적으로 패턴을 작성 결국 .

일반적으로이 상황에서 연결자를 작성하는 방법은 있습니까? 아니면이 상황에서 자신을 찾는데 이상한가요?

내가 필요할 때 여기 물어 보지 않을 생각 이었기 때문에 지금 당장 이것을 사용할 때의 실제 예가 없지만 유클리드 거리 수식을 매우 깔끔하게 쓰는 것을 상상할 수 있습니다. 과 같이 :

distance = sqrt . (+) :. (^2) 
+2

'flip'이 제거 될 수있다 :'(g합니다.). f. g' –

답변

24

이 기능은 Data.Function 모듈 on라고합니다.

흔히 sqrt . (+) `on` (^2)과 같이 중위 부호로 사용됩니다.

+2

나는 이것을 생각하지 못했다고 나는 믿을 수 없다! 무리 감사. – kqr

+0

일반적인 사용 예제는'sortBy (compare \'abs ')'입니다. –

+0

'비교 복근'은''복근' '에 비해 더 관용적입니다. 이것은'comparison = on compare'가 표준 라이브러리의 어딘가에 정의되어 있기 때문에 효과가 있습니다. – kqr

2

포인트 프리 스타일로 쓰지 마십시오. 이것은 point-free가 종종 읽기 쉽지 않다는 사실의 예입니다.

그냥 thusly 히 그것을 정의 :

(:.) :: (b -> b -> c) -> (a -> b) -> (a -> a -> c) 
infixr 9 (:.) 
f :. g x y = f (g x) (g y) 
+0

여기서 중온 연산자는 의심 스럽습니다. 특히 많은 경우'(.)에': .' 또는'. :'를 사용했기 때문에 의심 스럽습니다. (.)' – jozefg

+0

@jozefg 메신저를 쏘지 마십시오. OP가 질문에서 사용한 상징입니다. –

+0

@jozefg 나는 올빼미 연산자에 실제로 사용되는'. :'와 평행하게 ': .'을 고의로 선택했다. '. :'는 왼쪽에 하나의 인수 (따라서 점)와 오른쪽에 두 개의 인수 (따라서 이중 점)의 함수를 취하는 것으로 볼 수 있습니다. 따라서': .'는 두 개의 인수의 함수를 취해야합니다 왼쪽에 하나의 인수가 있고 오른쪽에 함수가 있습니다. – kqr