2011-03-14 10 views
17

저는 커닝 기술이 무엇인지에 대한 많은 문서와 질문을 보았습니다. 그러나 실제로 그것을 사용하는 이유에 대한 정보는 거의 찾지 못했습니다. 내 질문은, 무엇 currying의 장점은 무엇입니까? 아마도 기존의 메소드 호출보다 currying이 더 나은 예제를 제공 할 수 있습니다.currying의 실질적인 이점은 무엇입니까?

나는 태양이 올라가고있는 동안 C++에서 일하기 때문에, 현재까지 언어로 땜질을하는 것 이외의 다른 것들을 다룰 기회가 거의 없었다.

+1

관련있는 것 같습니다 : http://stackoverflow.com/questions/4888480/practical-use-of-curried-functions/4894045#4894045 - 질문에 대한 대답입니까? –

+0

감사. Jakob의 게시물은이 경우 많은 통찰력을주었습니다. 링크 된 게시물은 그것에 기반합니다. –

+1

이 답변에는 단순하고 비 이론적 인 예제가 있습니다. http://stackoverflow.com/questions/2725811/is-currying-just-a-way-to-avoid-inheritance/2725841#2725841 – jtolle

답변

13

먼저, 부분 함수 응용을 실수로 잘못 입력하는 것이 일반적입니다. 예를 들어 this을 참조하십시오 (더 나은 자원을 설명하는 것이 확실하지만, 이것은 제가 처음 발견 한 것입니다). 실제로 거의 모든 사람이 실제로는 currying을 사용하는 것을 보지 못했습니다. (Haskell과 같은 언어는 예외입니다. 모든 기능은 언어 자체로 말하지만 말하자면 단순한 부분 기능 응용을 가능하게합니다.) 반면 부분 함수 응용 프로그램은 많은 언어에서 유용합니다.

어쨌든 (부분적으로 함수 응용 프로그램에 대해 이야기하고 있다고 가정 할 때 (대부분의 사람들이 currying에 대해 질문 할 때 이야기하고 있기 때문에) 개념은 C++에서 순수한 함수 언어와 같이 자연스럽지 않습니다. , 예를 들어 하스켈 (Haskell).

예를 들어 여기서 숫자 list의 배열을 취하여 모든 숫자를 합한 함수 sum을 정의합니다. 접이식 개념이 불충분하다면 (또는 때로는 축소 또는 주입) this을 읽으십시오. 어쨌든, 다음과 같이 보일 것입니다 :

sum list = foldl (+) 0 list 

그러나 잠시 기다려주십시오. 부분 기능 응용 프로그램을 사용하여 단축 할 수 있습니다! 인수를 제공하는 대신 sum은 foldl과 같은 함수이며 +와 0을 부분적으로 적용한다고 가정합니다.

sum = foldl (+) 0 

어느 것이 더 읽기 쉽습니까? 선호도의 문제는 아마 그렇지만 후자는 내 의견으로는 합계와 foldl 간의 관계를 더 분명하게 강조합니다. 그리고 이것이 매우 간단한 예임을 고려하십시오. 솔직히 C++로 좋은 예제를 작성하는 법을 알지 못하기 때문에 거기서 나를 용서해야합니다. 어쨌든 실질적인 이점은 무엇입니까? 해독 성. 더 명확한 의도. 더 짧은 코드.

면책 조항 : 실제로 (부분 기능 응용 프로그램과 반대되는) currying의 이점을 알고 싶다면이 모든 것을 읽도록 유감스럽게 생각합니다. 그러나 다른 한편으로는, 두 가지의 차이점을 이해한다면, currying은 부분 함수 적용을 구현하는 좋은 방법이라는 것을 이해할 것입니다.

+3

포인트는 첫 번째 예제에서 +를 부분적으로 적용하면 더 명확하게 설명됩니다. 또한 부분적으로 적용 할 수 있도록 커리가 필요하지 않습니까? 따라서 곱슬 곱슬 한 인수를 카스틴 인수 (예 : 하스켈의 '카레'함수)로 변환하는 프로세스가 매우 유용합니다. –

+0

"가독성 더 명확한 의도,보다 짧은 코드"솔직히 말해서 이것은 읽을 수있는 기능 코드가 일반적으로 얼마나 비싼지를 고려할 때 끔찍한 약점입니다. 제 생각에 당신은 '친숙 함 편견 때문에'라고 말하는 것 같아요. – JoyalToTheWorld

관련 문제