2011-07-06 6 views

답변

4

관련 질문 커버로, Practical use of curried functions?,이 많은 이유는 사람들이 왜 값 태닝하고 그것의 사용을 포함 : 코드 재사용을 개선

  • 이 - 특별한 경우 함수는 단순히 부분적으로 적용됩니다 (카레) 일반적인 기능
  • 향상 코드의 가독성 - map (+2)은보다 쉽게 ​​읽을 수 map (\x -> x + 2)
  • 향상된 성능 - 태닝 분명 특정 전문을 할 수 있고, 좋은 컴파일러는
  • 0에 대한 전문 버전을 생성합니다
  • 재미있게 - 코드가 간단할수록 더 아름다운 코드가 더 즐겁습니다.
2

실제 혜택 내가 찾은 :

  • 적은 버그 - 함수의 합성으로 코드를 작성하는 것은 필수적 제어 흐름보다 더 정확한 코드 발생하는 경향이있다. 당신이 사용하는 경우 예를 들어, 당신이 많은 "해제 하나"인덱싱 오류

    의 위험을 제거하지 않고 "루프에 대한"보다 "지도"를
  • 더 나은 동시성 - 당신은 순수, 부작용없는 기능을 만들고 코드 자동으로 스레드로부터 안전합니다. 이것을 불변의 영구적 인 데이터 구조와 결합하면 강력한 동시 코드를 작성할 수있는 좋은 방법이 있습니다. http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey

  • 더 간결하고 관리 코드를 참조 - - 기능 코드가 필수적 OOP 코드보다 상당히 짧게 내 완전히 비 과학적 분석에 보인다 Clojure의이 특히 좋다. 프로그램이 커짐에 따라 이점은 더 두드러지는 경향이 있습니다. 여기에는 몇 가지 이유가 있다고 생각합니다.

    • 기능 언어의 구문은 매우 간결합니다. Haskell과 다양한 Lisps는 모두 매우 간단하고 우아한 문법을 ​​가지고있다.
    • 기능적 언어는 프로그램의 일부분을 함께 붙이기보다는 (고차 함수의) 합성을 장려하는 경향이있다. 따라서 많은 다른 패러다임에 내재 된 많은 상용구를 피할 수 있습니다.
    • 구성 요소와 관련하여 DRY 원칙을 기능 언어로 적용하는 것이 더 쉬운 것으로 나타났습니다. 일반적인 패턴을 보았다면, 이것을 다른 곳에서 사용할 수 있도록 고차 함수 (또는 당신이 Lisper라면 매크로)로 꽤 쉽게 추출 할 수 있습니다.
  • 테스트 용이성 - 당신이 순수 기능을 기본적으로 코드를 작성할 때, 그것은 강력한 테스트를 작성하는 것은 매우 쉽습니다. - 당신은 당신의 머리에 꽤 복잡한 추상적 인 개념을 유지해야하기 때문에 좀 더 정신적 민첩성을 필요

    • 그것은을 쓰기 어렵습니다 :

    물론이 OFSET 몇 가지 단점이 있습니다. 그것은 당신이 훈련 된 수학자 (나는)이지만 여전히 OOP보다 기능적인 코드를 작성하는 데 도움이됩니다.

  • 성능 오버 헤드가 있습니다. - 기능적 언어는 필연적으로 어느 정도의 오버 헤드를 암시하는 다양한 구조를 사용합니다. 이것은 좋은 컴파일러로는 꽤 작게 만들 수 있지만 완전히 제거 할 수는 없습니다.
  • 라이브러리/도구 지원 - 이것은 거의 OOP 플랫폼과 도구의 성숙도가 높아짐에도 불구하고 여전히 문제입니다. 장기적으로 이것은 문제가되지 않을 것이지만 내가 찾은 최선의 해결책은 Clojure를 사용하는 것이다. Clojure는 자바 플랫폼 라이브러리와 툴을 최대한 활용할 수있다.
+1

아 질문을 오독하고 "기능적 프로그래밍의 가치는 무엇인가"와 같은 대답을했습니다. 와! – mikera

1

나는 나 자신이 코드를 작성하는 등

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은 썽크를 실행하고 조건자를 검사하고 정리합니다. 잡동사니 그릇.

관련 문제