2016-06-20 1 views
0

일부 기능 언어에서는 부분적으로 적용된 함수와 카 트리 함수가 비슷하지만 뚜렷한 개념입니다.하스켈에서는 부분 적용과 다림질의 개념이 서로 바뀔 수 있습니까?

Learn You a Haskell for Great Good을 읽으면 작성자는이를 서로 바꿔 적용하는 것으로 보입니다.

[카레 기능] 하스켈의 모든 기능에는 공식적으로 하나의 매개 변수 만 사용됩니다. 우리가 너무 적은 매개 변수로 함수를 호출하는 경우

...

, 우리는 우리가 떠날 때 많은 매개 변수를받는 함수를 의미, 다시 부분적으로 적용 기능을 얻을.

내 질문 : 하스켈에서 부분 적용 및 currying 개념을 바꾸어 놓을 수 있습니까?

+0

정직한 대답은 짧고 예입니다. – hao

+3

필자에게 "currying"은 함수 정의와 관련이 있지만 "partial application"은 함수 호출과 관련이 있습니다. 그래서 그것들은 정확히 교환 할 수있는 것이 아닙니다. 그러나 그들은 같은 동전의 뒤집힌면이고, 다른면이 없다면 의미가 없습니다. 일부 기능 언어에서 "유사하지만 구별됩니다"라고 말하면 정확히 무엇을 언급하고 있습니까? – ruakh

+0

또한 * type 시스템 *이 카레 단항 함수를 독점적으로 다루는 반면 GHC의 * generated code * 함수는 여러 인수를 취합니다. 클로저는 부분적으로 적용된 함수에만 할당됩니다. 이는 코드가 카레트 해석 (curried interpretation)에 따라 유형을 검사했기 때문에 가능합니다. 즉, 코드가 uncurried 해석에 대한 isomorphic * 즉 유형 보존 최적화입니다. –

답변

4

서로 다르지만 관련 개념입니다. 함수 정의가 카레되기 (curried) 때문에, 함수를 부분적으로 적용하면 (즉, 예상보다 적은 인수로 호출 할 때) 인수가 더 적은 다른 함수가 반환됩니다.

가 부분적으로 적용 할 수 있도록 태닝 과정은

function(x) {return function(y) {return x+y;};} 

태닝이로

function(x,y) {return x+y;} 

도는 단항 함수 N "층"을 가진 n 차 함수를 대체 함수를 정의하는 부분이며 부분적으로 응용하면 함수를 호출 할 때 함수로 수행하는 작업입니다.

관련 문제