함수형 프로그래밍에 대한 가장 강력한 의견은 무엇입니까? [닫은]


25

함수형 프로그래밍 은 가장 오래된 프로그래밍 패러다임 중 하나입니다. 그러나 더 인기있는 패러다임에 비해 업계에서는 많이 사용되지 않습니다. 그러나 그것은 학계에서 크게 강조되었습니다.

함수형 프로그래밍에 대한 가장 강력한 의견은 무엇입니까?


5
LINQ? .NET 대리인? Mathematica와 같은 DSL?
Jon Harrop

5
또한, "기능 프로그래밍"이라는 용어는 다른 사람들이 다른 것을 의미하기 위해 사용되므로 사용중인 의미를 명확히해야합니다.
Jon Harrop

2
함수형 코드 기반으로 코딩 할 사람을 찾지 못할 것입니다. 훌륭한 비즈니스 결정이 아니므로 인재 풀을 제한합니다.
Patrick Hughes

답변:


52

문제는 가장 일반적인 코드는 본질적으로 비즈니스 앱, 게임, UI 등의 상태와 관련이 있다는 입니다. 앱의 일부 는 순전히 작동하는 데 문제가 없습니다 . 실제로 대부분의 앱은 하나 이상의 영역에서 이점을 얻을 수 있습니다. 그러나 모든 곳에서 패러다임을 강요하는 것은 반 직관적 인 느낌입니다.


19
전혀. 순수한 함수형 프로그래밍은 상태 지향적 인 응용 프로그램에는 적합하지 않습니다. 이것이 제가 둘 다 할 수있는 하이브리드 언어를 좋아하는 이유입니다. 기능적 문제에는 기능적 패러다임을 사용하고, 필수 문제에는 명령 적 패러다임을 사용하십시오.
Matt Olenik

8
동의했다! 상태는 프로그래밍의 필수 부분입니다. FP 언어 중 가장 순수한 FP 언어로도 Haskell조차도 상태와 IO를 사용할 수 있습니다. IO 코드 / 변경 가능한 상태 코드와 순수한 코드를 구별하는 것만으로 테스트와 이해가 매우 쉽습니다. .
Bill

8
그래서 하스켈을 좋아합니다. 이러한 상태 저장 코드를 최소화하는 것이 좋습니다. OO에서는 재사용 가능하고 이해하기 쉽고 테스트하기 쉬운 코드를 작성하는 것을 목표로합니다. 코드로 끝나는 대부분의 시간은 Haskell에서 크게 다르지 않습니다.
LennyProgrammers 2013

4
"IO 코드 / 변경 가능 상태 코드와 순수 코드를 구별하기 만하면 테스트에 매우 유용합니다." 타입 시스템을 우회하거나 모나드 크리프를 도입하지 않으면 디버그 메시지를 인쇄 할 수도 없습니다.
Jon Harrop

2
아마도 순수한 함수 프로그램은 그것을 실행함으로써 세상을 완전히 변화시키지 않을 것입니다.
Martin Beckett

24

함수형 프로그래밍의 문제는 함수형 프로그래밍 그 자체가 아닙니다. 함수형 프로그래밍 자체는 대부분의 사람들이이를 수행하는 언어를 디자인하는 사람들과 대부분의 사람들입니다.

문제는 매우 영리하지만 (때로는 똑같이 훌륭하지만) 너무 많은 사람들이 순결, 완벽, 세계에 대한 자신의 (종종 좁은) 견해를 강요하는 것에 대해 너무 광신적이라는 사실에서 비롯됩니다. 언어와 그것을 사용하는 모든 사람.

결과 중 하나는 타협하지 않는 것입니다. 이것은 (다른 것들 중에서도) 대략 10,000 개의 언어와 방언으로 귀찮게하기에는 충분하지만 다른 것보다 진정으로 중요한 이점을 갖기에는 거의 다른 언어로 이어집니다. 많은 사람들이 현실 세계를보고 기능 모델에 잘 맞지 않기 때문에 기본적으로 잘못되고 가장 무시된다고 결정합니다.

타협 할 수 없다는 또한 문제의 특정 유형 (또는 문제의 몇 가지 특정 유형)에 대해 절대적으로 아름다운하지만 정말 꽤 많은 언어로 이끌었다 빨아 많은 다른 사람을 위해. 그 중 일부는 아마도 기능적 모델 자체에 기인 한 것이지만,이 영역에서 시작되는 기본 성격 유형에 의해 더 많이 발생하는 것 같습니다 (적어도 나에게는).

그로 인해 많은 문제가 발생합니다. 우선, "기능적 프로그래밍"을 배우는 것은 철학적으로 가치가 있습니다. 대부분의 다른 유형의 언어에서는 특정 장르의 한 언어를 아는 것이 다른 언어를 배우는 데 큰 도움이됩니다. 프로젝트에서 언어 XI를 사용하는 경우 일반적으로 언어 Y (X는 아님)를 상당히 안전하게 알고있는 사람을 고용 할 수 있습니다. 기능적 언어를 사용하면 훨씬 덜 사실입니다. Erlang을 잘 알고 있을지 모르지만 여전히 Haskell 모나드가 완전히 외국이고 이해할 수없는 것을 발견합니다.

다수의 언어와 재능의 이식성이 제한되어 있으며, 추악한 상황이 발생합니다. 한 언어 나 방언이 합리적으로 일반적인 사용에 필요한 "중요한 질량"을 형성하는 것은 거의 불가능합니다. 그건 천천히 변화, 그러나 그것은 많은 리눅스가 지배적 데스크톱 OS되고처럼 아직 - 사람들이 인수 설득력을 마련 매년 마지막 이 될 것입니다 년 - 그냥 사람처럼 모든 것을 예측했습니다 사람 수십 년 동안, 그들은 다시 잘못 될 것입니다. 그것은 예측할 수없고 "올해가 아니라"라고 생각하는 사람들이 지금까지 옳았다는 것입니다.


4
기능 언어가 더 많으면 기능 언어간에 더 많은 교차가있을 수 있습니다.
베리 브라운

5
순결이 없으면 "기능적"일 수 없습니다. 일단 당신이 선을 넘어 서면 전체 개념이 분리되고 어떤 장점도없이 혼란스럽고 평행 한 표준 언어로 끝납니다.
Patrick Hughes

7
첫 번째 문제는 그래서 함수형 언어가 있다는 것입니다 하지 서로를 통해 이점을 가지고 서로 다른만큼, 그리고 두 번째 문제는 그들이 있다는 것입니다 너무 쉽게 사이에 갈 다릅니 까?
Tikhon Jelvis

2
나 에게이 답변은 맹세처럼 읽습니다. 당신이 몇 가지 예를 제시한다면 당신의 주장은 훨씬 더 설득력이있을 것입니다.
Benjamin Hodgson

1
...roughly 10,000 languages and dialects that are enough different to annoy but only rarely enough different for one to have a truly significant advantage over the others...아니요,이 모든 절차 적 언어처럼 들립니다. Java, Scala, Kotlin, C ++, C #, Groovy, Cheddar, ES6, Ceylon, Python 등이 계속 이어지고 있습니다. 실제 문제를 해결하지 못하는 C의 지루한 반복입니다. D : 즉,이 ranty 답변 보완하기 위해 내 ranty 의견이다
고양이

17

함수형 프로그래밍이 널리 사용되지 않는 이유는 너무 많이 사용되기 때문입니다. "이 언어 전체가 하나의 큰 추상화 역전"이라고 말하지 않고 Lisp 또는 Haskell과 같이 신중하게 살펴보기는 어렵습니다. 필요할 때 코더가 얻을 수없는 기준선 추상화를 설정하면 언어가 단순히 할 수없는 기능을 설정하고 언어가 더 기능적 일수록 더 많은 경향이 있습니다.

예를 들어, 하스켈을 보자. 기능적 순도라는 이름으로, 어떤 것과도 상호 작용하는 모든 컴퓨터 프로그램의 가장 기본적인 두 부분 인 상태 및 I / O를 관리하기 위해 아무도 이해하지 못하는 두뇌 파괴 추상화 역전을 사용해야합니다 ! 빨리 늙어 간다.


9
+1인데, 때로는 고급 수준의 언어로 프로그래밍 할 때도 같은 느낌이 듭니다. 예를 들어, fsck가 C 에서처럼 함수 포인터를 사용하는 대신 Java에서 단일 메소드 인터페이스를 구현하는 단일 메소드 클래스를 만들어야하는 이유는 무엇입니까?
dsimcha

14
나는 당신이 그 추상화를 "아래에 놓을 수 없다"고 말하는 것이 아니라 단지 많은 작업을 필요로한다는 것입니다. 우리는 바나나를 집어 들고 명령적인 언어로 먹는 데 익숙합니다. Haskell (예를 들어)은 20 페이지짜리 양식을 먼저 작성합니다. 우선보고 싶지 않을 때 바나나가 신비 로워지지 않도록 보장하기 때문입니다. 바나나에 대해 추론 할 때 도움이되지만 때로는 배가 고프기도합니다.
j_random_hacker

4
@ dsimcha : 이것은 높은 수준의 명령형 언어가 아닌 Java의 특성입니다. 실제로, 고급 언어는 아마도 일류 객체로서 기능을 수행 할 가능성이 높습니다.
Muhammad Alkarouri

3
하스켈에서 모나드의 필요성은 기능적 순도가 아니라 부작용과 게으른 평가가 함께 맛보지 않는 두 가지 맛이라는 사실에서 비롯됩니다. Monads 강제 순차 평가. (실제로, 그들은 Computation Builders 또는 무언가라고 부릅니다. '모나드'는 카테고리 이론가 이외의 다른 사람에게는 형편없는 이름입니다.) 그리고 모나드를 (의도적으로 사용하지 않고) 행복하게 FP를 할 수 있습니다!
Frank Shearar

4
한 가지 주목할 점 : 이러한 "추상 반전 (abstraction inversions)"을 고려하면 언어가 더 제한적일 수 있지만 컴파일러와 런타임은 코드에 대해 더 많은 보증을 제공하며 더 많은 작업을 수행 할 수 있습니다. 이것은 가비지 수집과 같습니다. gc 언어에서는 malloc 공간 (유용 할 수 있음)을 할 수는 없지만 런타임은 수동으로보다 효율적으로 모든 메모리를 관리 할 수 ​​있습니다. 기능적 순도도 마찬가지입니다.
Tikhon Jelvis

8

모든 것을 존중하면서 귀하의 질문이 잘못 제기 된 것 같습니다. 함수형 프로그래밍은 도구 또는 특정 종류의 문제를 해결하는 데 유용한 도구 모음입니다. 그것에 대한 의견을 갖는 것은 특정 문제 또는 응용의 맥락에서 의미가 있습니다. 일반적으로 그것에 대한 의견을 갖는 것은 플라이어 또는 렌치에 대한 의견을 갖는 것과 같습니다.


4
논리적으로 유효한 점이지만 OP 질문의 마지막 문장에 대해 "자주 발생하는 프로그래밍 문제에 대해"조치함으로써 해결할 수 있습니다. (독자 독자들이 다른 문제를 겪고 있다는 것을 중요하게
여깁니다

4

비록 그것을 마스터했다고해도, 널리 이해되지 않는 단순한 이유 때문에 상용 제품에 기능적 언어를 사용하지 않을 수도 있고, 사업이 성장할 것으로 예상되는 경우 다른 개발자의 능력을 찾는 능력에 대해 걱정할 것입니다 시간이 지남에 따라 그것을 유지하거나 연장하는 것.

상상할 수 없으며, 실제 해킹 기술이없는 자바 스쿨 졸업생은 해당 유형의 프로젝트에서 어디에서 시작 해야할지 알지 못하기 때문에 아마도 더 높은 수준의 개발자를 얻게 될 것입니다. 비즈니스 관점에서.


2

시장에 시간

절차 적 코드와 만트라의 전체 IT 환경을 제거하기가 어렵습니다.


1
기능적 프로그램은 종종 테스트하기가 더 쉽습니다. 그리고 그들은 더 짧습니다. 따라서 동의하지 않습니다. 또 다른 질문에 대답한다고 생각합니다. "기능 프로그래밍으로 전환하는 것에 대한 가장 강한 의견은 무엇입니까?"
Jonas


2

우선 나는 state-ful programming과 fp에 관한 논쟁을 받아들이지 않습니다. haskell에서 State 모나드를 살펴보면 코드에 대한 State의 영향을 평가할 수있는 흥미로운 새로운 방법이 많이 있습니다.

내가 fp에 대해 의미있는 논쟁을한다면, haskell과 같은 진지한 기능적 언어를 배우는 것은 포뮬러 원 자동차를 운전하는 것을 배우는 것과 같습니다. ... 흥미롭고 교육적이지만 평범한 산업 코딩에는 슬프게도 쓸모가 없습니다. , 동료들이 캠리를 운전하고 있으며 매우 기뻐합니다. fp- 친화적 인 환경에서 일자리를 찾기는 여전히 극히 어렵고, 자신이 스스로 파업하거나 fp의 잘 알려진 전문가를 찾지 않으려는 경우가 아니라면 이러한 변화를 볼 수 없습니다.

내 답변이 fp fanboy로 표시되는 것으로 가정합니다. 왜하지 말아야 할 이유를 찾는 것에 대해 걱정하기 전에 haskell과 같은 실제 fp 언어를 사용하는 것이 좋습니다.


6
첫 번째 단락은 FP 사고 방식의 문제점을 정확하게 설명합니다. 우리는 "코드에 대한 국가의 영향을 평가하는 흥미로운 새로운 방법"을 원하지 않습니다 . 그게 무슨 뜻입니까?!? 우리는 단지 상태가 존재하고 실제로
메이슨 휠러

2
Camry I 드라이브에는 문제가 있지만 공간 누출 여부를 후드 아래에서 지속적으로 점검 할 필요는 없습니다 . Haskell은 F1 자동차처럼 보이는 언어 비슷하지만 실제로 오랜 시간 동안 높은 회전을 할 수는 없습니다. :-P
j_random_hacker

1
@Mason Wheeler : "우리는 코드에 대한 국가의 영향을 평가하는 흥미로운 새로운 방법을 원하지 않습니다." 대신, 우리는 원하지 않는 부작용 (개인적인 경험으로 말함)으로 인해 매우 불쾌한 버그를 추적하기 위해 일주일을 보내는 것을 선호합니다.
Giorgio

@brad clawsie : FP에서 부작용을 제어하는 ​​모든 문제는 코딩을 훨씬 더 생산적으로 만드는 데 도움이 될 수 있다고 생각합니다. 불행히도 먼저 학습에 많은 노력을 기울여야하며, 많은 프로그래머는 이러한 장기적인 사고를하지 않습니다. 일이 빨리 이루어져야합니다. 처음에는 제대로 할 시간이 없지만 나중에 디버깅하고 수정할 시간이 항상 있습니다. :-)
Giorgio

@Mason Wheeler : 기능적인 관점에서 공유 상태를 갖는 것은 최적화 목적으로 만 유용합니다. 값을 복사하는 데 시간과 메모리가 너무 많이 걸리므로 불필요한 복사를 피하기 위해 데이터 객체를 공유합니다. 그러나 처음부터 공유 상태를 적용하는 것은 일종의 조기 최적화입니다.
Giorgio

2

나는 열렬한 팬이며 기능적 프로그래밍을 옹호합니다. 그러나 여기 내 요점이 있습니다.

  • 배우기 쉬움
    파이썬이나 루비 같은 프로그래밍 언어는 배우기 쉽습니다. Haskell, Agda, Coq, ATS 등과 같은 언어를 사용한 고급 기능 프로그래밍은 배우기가 매우 어렵습니다. 어떤 사람들은“수학적 구조적 프로그래밍”이라는 용어를 사용합니다. 범주 이론과 추상 수학에 익숙하면 쉽지만 "모나드"와 같은 실마리가 없다면 꽤 효과가 있습니다.

  • 스크립팅 언어로 프로그래밍하면 생산성이 향상 될 수 있습니다.
    경우에 따라 Python 및 Ruby와 같은 스크립팅 언어를 사용하면 생산성이 향상 될 수 있습니다. 이는 서로 다른 패키지 또는 라이브러리를 빠르게 프로토 타이핑하고 함께 붙이는 것을 의미합니다. 이러한 맥락에서 동적 언어 (예 : 동적 객체 지향 프로그래밍)를 사용하는 것도 좋습니다. 일반적으로 정적 입력이 더 좋지만 동적 유형을 사용한 스크립팅은 긍정적 인 영향을 줄 수 있습니다.

  • 비즈니스 고려 사항
    프로그래밍은 성공적인 소프트웨어 프로젝트의 작은 부분 일뿐입니다. 소프트웨어가 작동해야하고 사용자는 만족해야하며 사용 된 프로그래밍 언어에 반드시 의존 할 필요는 없습니다. 관리자는 새로운 기술과 프로그래밍 언어를 평가할 때의 이점과 위험을 고려해야합니다. 새로운 프로그래머가 새로운 프로그래밍 언어를 빠르게 배울 수 있습니까? 기술력이있는 회사에 경험이 있습니까? 위험이 있습니까? 상급 관리자와 논쟁하기가 어렵습니까?

비즈니스 상황에서 기능 프로그래밍은 핵심 소프트웨어 구성 요소 (예 : 미션 크리티컬하지 않은 구성 요소)에 추가하는 시스템에서 사용할 수 있습니다. 예를 들어 핵심 소프트웨어를 거의 변경하지 않지만 새로운 프로그래밍 언어로 새로운 부품 (GUI, 모니터링 소프트웨어 등)을 추가하는 은행이 있습니다. (예외가 있을지 모르지만 이것은 은행에 대한 나의 경험입니다.)

또한 함수형 프로그래밍은 공식 검증이 이익이거나 필수 일 때 매우 유용합니다.


3
"쉽게 배우기": 현대적인 C ++를 마스터하는 것보다 Haskell을 마스터하는 것은 어렵습니다. 익숙하지 않은 것을 열심히 생각하는 경향이 있다고 생각합니다.
조르지오

1

저는 FP를 유용한 패러다임으로 반대하는 것이 아니라 프로그래밍 언어에서 사용할 수있는 유일한 패러다임으로 반대합니다.

많은 문제를 해결하는 데 유리합니다. 그러나 FP는 C와 같은 절차 적 언어로 적용될 수 있으며 지금까지도 적용되었습니다.


첫 번째 문장에 동의하고 두 번째 문장에 동의하지 않습니다. 가비지 수집 없이는 기본적으로 FP를 수행 할 수 없습니다.
dsimcha

"프로 시추 럴"레이블에 맞추기 위해 언어의 런타임 시스템에 투명한 메모리 관리 (가비지 수집 기능이 없음)가 필요하지 않으므로 두 번째 문장을 그런 식으로 표현한 것이 아이러니합니다. BASIC은 그러한 언어 중 하나입니다.
Huperniketes

"가비지 수집 없이는 기본적으로 FP를 수행 할 수 없습니다." - 왜?
quant_dev

+1 가장 기본적인 수준의 기능적 프로그래밍은 상태 비 저장 프로그래밍입니다. 나는 이것을 어느 정도 할 수없는 언어가 있다고 생각하지 않습니다 . C, C ++, Java, 어셈블리, C #, 심지어 Basic으로 함수를 작성했습니다. 필요한 것은 함수가 부작용이 없거나 호출 사이에 상태를 유지하는 것입니다.
Michael K

다른 한편으로, 당신의 언어가 완전히 순수하다면, 컴파일러는 최적화에 더 많은 여유가 있습니다. 또한 코드를 테스트하고 추론하기가 더 쉬워집니다. 전반에 걸쳐 기능이기 않습니다 하이브리드 접근 방식을 통해 어떤 혜택을 줄; 어쨌든 코드의 대부분이 상태 비 저장 상태가 되려면 조금 더 나아가서 추가 혜택을 누릴 수 있습니다.
Tikhon Jelvis

1
  1. (그리고 지금까지 가장 중요한) 프로그래머의 노동력은 그러한 언어 나 스타일로 훈련되지 않았습니다.
  2. 기능적인 전도자들 중 많은 사람들이 기능적인 물건을 팔려고하는 방식 때문에 구멍이나 과일 케이크로 떠납니다. 아무도 홀을 좋아하지 않으며 과일 케이크 뒤에 돈을 버리지 않을 것입니다. 나는 당신에게 정말 기능적인 것을 좋아하고 그것을 끌어 내고 싶지만, 나는 직장에서 나는 훈련에 돈을 쓰지 않고 그것을 개발할 수있는 유일한 사람이 될 것이라는 것을 알고 있습니다. 독자의 대화를 참조하십시오.

기능은 수백 개의 코어가 있고 잠금이 확장되지 않는 실현에 부딪 칠 때 나타납니다. 그런 다음 중첩 된 데이터 병렬이 "큰 철분"프로그램을 수행 할 수있는 유일한 방법이 될 것이며 기능면에서 뛰어납니다.


0

FP는 성능을 무시하면서 멋진 짧은 프로그램을 작성하는 것이 시원하기 때문에 학계에서 시원합니다. 현실 세계에는 이에 대한 음모가 없습니다. 또한 예를 들어 일부 물건 (예 : 기수 정렬)을 구현하면 FP의 총 통증처럼 보입니다. 아 그리고 생성 된 코드는 IMHExperience sloooooooooooooooooooow입니다.


4
네, 그건 사실이 아닙니다. Haskell 코드는 일반적으로 C 및 Java와 동등하며 Python 및 친구보다 훨씬 빠릅니다. 또한 병렬화하는 것이 일반적으로 쉽지 않기 때문에 잠재적으로 더 빠른 속도를 제공합니다.
Tikhon Jelvis

0

일부는 학습 곡선이 상당히 가파르고 시간이 오래 걸립니다 (특히 OOP에서 온 경우 패러다임 전환을 받기 전에 머리를 몇 번 부리 게됩니다).

함수형 프로그래밍 (Java에서오고 Clojure로 이동)을 시작했지만 여전히 여전히 어렵습니다. 커뮤니티는 Java만큼 표현적인 코드를 작성하지 않는 것 같습니다.

표현력이 약간 떨어지고 복잡성이 약간 증가한 것 같습니다.


이전 프로그래밍 경험이없는 사람들은 FP가 수학에 더 가깝기 때문에 OOP가 FP보다 가파른 학습 곡선을 가지고 있다고 말할 것입니다. "커뮤니티가 Java처럼 표현적인 코드를 작성하지 않는 것 같습니다"라는 말의 의미를 이해하지 못합니다. 요점은 무엇입니까?
Jonas

나는 표현력을 잃는 기능적 언어에 대해 들어 본 적이 없다 그러나 Java보다 표현력이 낮은 언어를 사용한 적이 없으므로 "표현식"의 정의가 다를 수 있습니다.
glenatron

@Jonas-함수, 변수 등의 바로 가기 이름 때문에 ... 단지, 왜 그들이 무엇을해야하는지 또는 무엇을해야하는지에 대한 이름을 지정하지 않는가? 왜 "pmap"입니까?
Belun

1
@Belun : 기능 프로그래밍과 관련이 없습니다. 특정 프로그래밍 언어를 참조해야합니다. Map 은 많은 함수형 프로그래밍 언어에서 공통적 인 함수이며 이름좋습니다 . pmap병렬 변형 일 수 있습니다.
Jonas

나는 "커뮤니티가 글을 쓰지 않는 것 같다"고 말했다. 그것은 그것이 내가 경험 한 것임을 의미하며 그것은 내가 본 공동체에 의존합니다. 의심하지만 모든 사람에게 적용 할 필요는 없습니다. 이 기능 프로그래밍 할 필요가 않습니다, 그것의 스타일처럼
Belun

0

함수형 프로그래밍 언어에 대한 경험이 거의 없지만 (일부 Haskell 및 Lisp 알고 있음) FP 패러다임은 다른 패러다임보다 매우 강력하고 종종 우아합니다. FP를 사용하여 진지한 프로젝트를 진행할 기회가 있었기를 바랍니다.

FP의 효과와 관련하여 심각한 의문이 생길 수있는 유일한 영역은 귀납적으로 정의 할 수없는 복잡한 데이터 구조 (예 : 그래프)를 처리 할 수있는 방법입니다. 예를 들어, 큰 그래프에서 작동하는 알고리즘을 구현해야 할 수 있습니다. 그래프를 살펴보고 작은 로컬 변경을 수행하는 경우 FP 접근법이 프로그램이 노드에서 노드로 이동할 수있는 명령 방식과 일치하는지 궁금합니다. 포인터를 사용하는 노드.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.