0

현재 함수형 프로그래밍을 공부하고 있으며 가장 중요한 기능 : 고차 함수입니다.currying 및 HOF 이해하기

현재 내가 원하는 것만 큼 명확하지 않으므로 HOF가 어떻게 작동하는지 완벽하게 이해하고 싶습니다.

{- Curried addition. -} 
plusc :: Num a => a -> (a -> a) 
plusc = (+) 

우리가이 기능을 가 HOF을을 무두질하고 있습니다 사용하는 어느 정도 말할 수있는이 기능을 고려?

편집 : 기본적으로, 함수의 정의 (매개 변수, 연관성, 등)

+0

전체 범위로?나는 정확히 무엇을 요구하고 있는지, 어떤 부분을 이해하지 못하는지 모르겠습니다. – Bergi

+0

글쎄,이 함수가 어떻게 추가를 의미하는지 이해할 수 없다. 어느 정도까지 함수 정의 *가 더하기를 정의합니다. –

+1

덧셈은'+'연산자로 정의되며,'plusc'가 사용합니다. 어쩌면'plusc xy = x + y' 나'plusc = \ x -> \ y -> x + y' ('x + y' ='(+) xy') – Bergi

답변

0

HOF, 그 인수가 때로 믿을 수 있기 때문에 plusc 내가하고자하지 개인적으로 전화 첨가을 의미하는지 이해하지 않는다 기능이 없습니다. 함수가 HOF가 아님을 우리가 선택 괄호를 제거하면

{- equivalent signature -} 
plusc :: Num a => a -> a -> a 

, 그것은 분명하다 : 명백한 HOF를 발견 할 수있는 방법이 가 왼쪽 측면에없는 것을 서명에 괄호을 찾는 것입니다 그것은 기능을 필요로하지만, 그것은 카레입니다.

참고 : 모든 카레 기능 반환 함수는하지만, 우리가 부분적으로 적용한 후,이 함수를 반환하고, 같은 기능에서 작동 말할 수 수 있기 때문에 - 그래서이 HOF입니다. 이것은 개념을 설명/학습하는 데 특히 도움이되는 방법이라고 생각하지 않지만 정의가 매개 변수와 결과 모두에 걸쳐 있다고 가정합니다.

단순히 그룹 인수 것 인 uncurried 버전 :

plusUnc :: Num a => (a, a) -> a 

는 이제 HOF가 같은 기능을 가지고 다른 사람으로 바꿀 수 있습니다

imu :: Num a => (a -> a -> a) -> (a -> a -> a) 
imu f = \a b -> f a b 

주 : 람다 임프란트는 분명히 단순화 될 수 있었고, 단지 삽화를 위해 철자를 썼다.

fimu에 전달되는 "하위"차수 기능입니다. 이 기능을 사용하려면

imuPlus = imu plusc -- a function is being passed 

imuPlus 1 2   -- == 3 

참고 : 우리는 두 개념을 혼합하고 (당신이 모두 요구) 때문에, imu도 카레된다.

imuUnc :: ((a -> a -> a), (a, a)) -> a

가 지금은 HOF (이 매개 변수의 기능을 가지고있다)이지만, 위의 예와 다른 기능을 반환하지 않습니다 :는 uncurried 버전은 다음과 같을 수 있습니다. 그러나 부분적으로 적용되기 때문에 카레를 칠할 때 훨씬 쉽게 사용할 수 있습니다.

+0

높은 순서는 함수가 다른 함수를 반환한다는 것을 의미 할 수도 있는데, 이는 하스켈의 카 트리 함수에 대해 꽤 표준이다. – Bergi

+0

@Bergi 오 물론, * 함수를 반환하면 함수가 HOF가 될 수도있다. 그런 식으로는 거의 볼 수 없지만 그것을 편집 할 것입니다. –

+0

@Bergi 하스켈에서는 함수 반환 함수를 HOF라고 생각하지 않지만, 여전히 적합 할 것입니다. 'Num a =>'제약 조건이 함축적으로 많은 함수를 담고있는 사전을'plusc'에 넘기므로, 아마도'plusc'를 HOF라고 부르는 것이 더 유혹적 일 것입니다. 아직도, 나는 "HOF"용어가 더 이상 쓸모가 없다고 생각합니다. HOF는 너무 흔하게 통용되고 있습니다. – chi