저는 컨셉과 커링을 사용하는 방법을 알고 있지만 실제로 그 가치는 무엇인지 궁금합니다.Functional Programming에서 currying의 가치는 무엇입니까?
답변
관련 질문 커버로, Practical use of curried functions?,이 많은 이유는 사람들이 왜 값 태닝하고 그것의 사용을 포함 : 코드 재사용을 개선
- 이 - 특별한 경우 함수는 단순히 부분적으로 적용됩니다 (카레) 일반적인 기능
- 향상 코드의 가독성 -
map (+2)
은보다 쉽게 읽을 수map (\x -> x + 2)
- 향상된 성능 - 태닝 분명 특정 전문을 할 수 있고, 좋은 컴파일러는 0에 대한 전문 버전을 생성합니다
- 재미있게 - 코드가 간단할수록 더 아름다운 코드가 더 즐겁습니다.
실제 혜택 내가 찾은 :
적은 버그 - 함수의 합성으로 코드를 작성하는 것은 필수적 제어 흐름보다 더 정확한 코드 발생하는 경향이있다. 당신이 사용하는 경우 예를 들어, 당신이 많은 "해제 하나"인덱싱 오류
의 위험을 제거하지 않고 "루프에 대한"보다 "지도"를더 나은 동시성 - 당신은 순수, 부작용없는 기능을 만들고 코드 자동으로 스레드로부터 안전합니다. 이것을 불변의 영구적 인 데이터 구조와 결합하면 강력한 동시 코드를 작성할 수있는 좋은 방법이 있습니다. http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey
더 간결하고 관리 코드를 참조 - - 기능 코드가 필수적 OOP 코드보다 상당히 짧게 내 완전히 비 과학적 분석에 보인다 Clojure의이 특히 좋다. 프로그램이 커짐에 따라 이점은 더 두드러지는 경향이 있습니다. 여기에는 몇 가지 이유가 있다고 생각합니다.
- 기능 언어의 구문은 매우 간결합니다. Haskell과 다양한 Lisps는 모두 매우 간단하고 우아한 문법을 가지고있다.
- 기능적 언어는 프로그램의 일부분을 함께 붙이기보다는 (고차 함수의) 합성을 장려하는 경향이있다. 따라서 많은 다른 패러다임에 내재 된 많은 상용구를 피할 수 있습니다.
- 구성 요소와 관련하여 DRY 원칙을 기능 언어로 적용하는 것이 더 쉬운 것으로 나타났습니다. 일반적인 패턴을 보았다면, 이것을 다른 곳에서 사용할 수 있도록 고차 함수 (또는 당신이 Lisper라면 매크로)로 꽤 쉽게 추출 할 수 있습니다.
테스트 용이성 - 당신이 순수 기능을 기본적으로 코드를 작성할 때, 그것은 강력한 테스트를 작성하는 것은 매우 쉽습니다. - 당신은 당신의 머리에 꽤 복잡한 추상적 인 개념을 유지해야하기 때문에 좀 더 정신적 민첩성을 필요
- 그것은을 쓰기 어렵습니다 :
물론이 OFSET 몇 가지 단점이 있습니다. 그것은 당신이 훈련 된 수학자 (나는)이지만 여전히 OOP보다 기능적인 코드를 작성하는 데 도움이됩니다.
- 성능 오버 헤드가 있습니다. - 기능적 언어는 필연적으로 어느 정도의 오버 헤드를 암시하는 다양한 구조를 사용합니다. 이것은 좋은 컴파일러로는 꽤 작게 만들 수 있지만 완전히 제거 할 수는 없습니다.
- 라이브러리/도구 지원 - 이것은 거의 OOP 플랫폼과 도구의 성숙도가 높아짐에도 불구하고 여전히 문제입니다. 장기적으로 이것은 문제가되지 않을 것이지만 내가 찾은 최선의 해결책은 Clojure를 사용하는 것이다. Clojure는 자바 플랫폼 라이브러리와 툴을 최대한 활용할 수있다.
아 질문을 오독하고 "기능적 프로그래밍의 가치는 무엇인가"와 같은 대답을했습니다. 와! – mikera
나는 나 자신이 코드를 작성하는 등
configure_grid (grid, first_column, last_column, action) {
for (i = first_column; i <= last_column; ++i)
// ...
}
configure_grids (action) {
congifure_grid (alpha, first_alpha, last_alpha, action);
congifure_grid (beta, first_beta, last_beta, action);
}
대신 알파와 베타의 각각에 대해 한 번에 대한 루프를 작성 찾을 ++은 C/C에서 Once and Only Once
같은 비트 말할 것이다 . 이것은 절차 적 코드에서 currying하는 것과 유사합니다. 이점은 분명합니다.
커링은 중요한 이론적 개념이지만, 실용적인 용어에서 이점이 있습니다.
사실, 한 번 C에서 테스트 스위트를 작성 기억,이 같은 비트이었다
typedef bool (*predicate) (const type *);
const char * argument;
bool do_foo (const type * t) {
return bar (t, argument);
}
bool do_baz (const type * t) {
return bap (t, argument);
}
predicate foo (const char * arg) {
argument = arg;
return do_foo;
}
predicate baz (const char * arg) {
argument = arg;
return do_baz;
}
assert (for_all (data_set("alpha"), foo ("abc")));
assert (for_all (data_set("beta"), baz ("def")));
이 모든 순수 C에 있었다, 어떤 매크로 등 기능적인 스타일의 속임수없고, 가지 등 카레. 여기서 이점은 테스트 사례가 무엇인지 정확하게 한눈에 파악할 수 있다는 것입니다. data_set
은 비슷합니다. 데이터를 가져 오는 다른 함수에 인수를 바인딩합니다. for_all
은 썽크를 실행하고 조건자를 검사하고 정리합니다. 잡동사니 그릇.
- 1. Functional Programming에서 응용 펑터를 사용해야하는 이유는 무엇입니까?
- 2. currying의 실질적인 이점은 무엇입니까?
- 3. 인터페이스의 가치는 무엇입니까?
- 4. 여기에 비공개 회원의 가치는 무엇입니까?
- 5. roxygen literate programming에서 %를 벗어나는 방법은 무엇입니까?
- 6. Functional depedency analysis
- 7. FAT (Functional Acceptance Testing)이란 무엇입니까?
- 8. Selenium 또는 Rational Functional Tester
- 9. 야후의 가치는 그만한가?
- 10. 버튼의 가치는 어떻습니까?
- 11. Visual Studio CSS를 지원하는 가치는 무엇입니까?
- 12. WMD 편집기의 가치는 어떻게 얻습니까?
- 13. 왜 maxConcurrentSessions의 기본값은 너무 낮습니까? 그리고 안전한 가치는 무엇입니까?
- 14. Boost.Fusion Functional : 기본 인수가있는 함수 호출
- 15. Rational Functional Tester가 오브젝트 존재를 기다림
- 16. 어떻게 무엇을하여 Rational Functional Tester의 로그를 변경합니까?
- 17. android unit tests/functional tests를 어떻게 실행합니까?
- 18. binary_search, find_if 및 <functional>
- 19. Functional Reactive F # - 게임 저장 상태
- 20. http://sitename.com과 http://www.sitename.com의 가치는 어느 정도입니까?
- 21. PHP sess_ 파일의 가치는 어떻게 읽습니까?
- 22. perl hecking once once 모든 가치는
- 23. Eclipse에서 JUNIT_CONTAINER의 가치는 어디서 찾을 수 있습니까?
- 24. Grails 1.3.3 및 Functional Test 플러그인 1.2.7 문제
- 25. PHP : 이상한 배열 문제 - 내 가치는 어디 있습니까?
- 26. ASP.NET MVC 응용 프로그램에 사용할 쿠키의 가치는 어디에서 만들어야합니까?
- 27. BPM의 가치는 무엇입니까? (비즈니스 프로세스 관리) 사용 가치가 있습니까? 어떤 경우에?
- 28. Rational Functional Tester - 부모 스크립트에서 호출 된 스크립트를 부모 데이터 풀을 사용하여 얻으려면 어떻게해야합니까?
- 29. 함수 프로그래밍에서의 빅 데이터 구조
- 30. 일반 사전을 만드는 방법은 무엇입니까?
[카레 기능의 실용적인 사용법] (http://stackoverflow.com/q/4888480/298282)을 참조하십시오. –