왜 기능적인 언어입니까? [닫은]


332

여기서는 기능적 언어와 내용에 대해 많은 이야기를합니다. 왜 "전통적인"언어를 사용합니까? 그들은 무엇을 더 잘합니까? 그들은 무엇에 더 나쁜가? 이상적인 기능적 프로그래밍 응용 프로그램은 무엇입니까?


존 휴즈 (John Hughes)는 이것에 관한 논문을 썼습니다 : 왜 함수형 프로그래밍중요한가 .
Hjulle

답변:


214

기능적 언어는 명령형 및 객체 지향 언어와 다른 패러다임을 사용합니다. 그들은 부작용없는 기능을 언어의 기본 구성 요소로 사용합니다. 이것은 많은 것들을 가능하게하고 많은 것들을 더 어렵게 만듭니다 (또는 대부분의 경우 사람들이 익숙한 것과 다릅니다).

함수형 프로그래밍의 가장 큰 장점 중 하나는 부작용없는 함수의 실행 순서가 중요하지 않다는 것입니다. 예를 들어, Erlang에서는 매우 투명한 방식으로 동시성을 활성화하는 데 사용됩니다. 함수형 언어의 함수는 수학 함수와 매우 유사하게 동작하므로 함수형 함수로 쉽게 번역 할 수 있습니다. 경우에 따라 코드를 더 읽기 쉽게 만들 수 있습니다.

전통적으로 함수형 프로그래밍의 가장 큰 단점 중 하나는 부작용이 없다는 것입니다. IO없이 유용한 소프트웨어를 작성하는 것은 매우 어렵지만, 기능에 부작용없이 IO를 구현하기는 어렵습니다. 따라서 대부분의 사람들은 단일 입력에서 단일 출력을 계산하는 것보다 기능 프로그래밍을 최대한 활용하지 못했습니다. F # 또는 Scala와 같은 현대 혼합 패러다임 언어에서는 이것이 더 쉽습니다.

많은 현대 언어에는 기능적 프로그래밍 언어의 요소가 있습니다. C # 3.0에는 많은 함수형 프로그래밍 기능이 있으며 Python에서도 함수형 프로그래밍을 수행 할 수 있습니다. 함수형 프로그래밍의 인기 이유는 대부분 두 가지 이유 때문이라고 생각합니다. 동시성 (concurrency)은 점점 더 많은 멀티 프로세서 컴퓨터를 사용하기 때문에 일반 프로그래밍에서 실제 문제가되고 있습니다. 언어에 대한 접근성이 높아지고 있습니다.


14
파이썬에서 함수형 프로그래밍을 할 수는 있지만 정말 끔찍합니다. stackoverflow.com/questions/1017621/…
Gordon Gustafson

28
그것은이다 없는 순수 함수형 언어의 IO 코드를 작성하기 어렵다. 그것들은 모두 명령형 언어에서와 같이 작동하는 IO 코드를 작성하는 간단한 메커니즘을 제공합니다. 그들이 모두는 시행 이 인터페이스 IO를 수행하지로 선언 된 다른 코드 내부 IO 코드를 호출 할 수 없습니다. 유추는 자바와 같이 정적으로 유형이 지정된 언어가 메소드에서 원하는 유형을 리턴하는 것이 어려워 졌다고 불평하는 역동적 언어 프로그래머 일 것입니다.
Ben

9
Haskell은 순수한 기능 언어의 예이며, 단점은 없습니다. 실제로 부작용을 캡슐화하고 프로그래머가 명령형 언어보다 훨씬 강력한 추상화 수준을 달성 할 수있게하므로 부작용을 훨씬 쉽게 처리 할 수 ​​있습니다 ... 실제로, 모든 사람은 Haskell에게 시도하고, 실제로 파악하고, 실현해야합니다. 왜 그렇게 강력합니까?
FtheBuilder

202

나는 약 40 년 동안 (프로그래밍 스타일로) 사용되어 왔기 때문에 "캐치 온"프로그래밍에 대한 기능적 접근 방식에 대해서는 의문이 없다고 생각합니다. OO 프로그래머가 변경 불가능한 객체를 선호하는 깨끗한 코드를 작성할 때마다 해당 코드는 기능적인 개념을 차용합니다.

그러나 기능적 스타일 을 적용 하는 언어는 요즘 많은 가상 잉크를 사용하고 있으며 앞으로 이러한 언어가 지배적 일지 여부는 명백한 질문입니다. 내 자신의 의심은 스칼라오캄 과 같은 하이브리드, 다중 패러다임 언어 가 순수한 OO 언어 (Smalltalk, Beta 등)가 주류 프로그래밍에 영향을 주었지만 끝나지 않은 것과 같은 방식으로 "순수한"기능 언어를 능가 할 가능성이 높다는 것이다 가장 널리 사용되는 표기법으로

마지막으로, 나는 FP에 대한 귀하의 의견이 몇 년 전과는 다른 절차 적 프로그래머로부터 들었던 의견과 매우 유사하다는 점을 지적 할 수 없습니다.

  • (신화적인, IMHO) "평균적인"프로그래머는 그것을 이해하지 못한다.
  • 널리 알려지지 않았습니다.
  • 당신이 그것으로 쓸 수있는 모든 프로그램은 현재 기술로 다른 방법으로 작성할 수 있습니다.

그래픽 사용자 인터페이스와 "비즈니스 모델로서의 코드"가 OO를보다 널리 인식하는 데 도움이되는 개념 인 것처럼, 불변성과 더 단순한 (대규모) 병렬 처리의 사용 증가는 더 많은 프로그래머가 기능적 접근 방식이 제공하는 이점을 보는 데 도움이 될 것이라고 생각합니다 . 그러나 지난 50 년 동안 디지털 컴퓨터 프로그래밍의 전체 역사를 구성하는 많은 것들을 배운만큼 여전히 배울 것이 많다고 생각합니다. 20 년이 지난 지금 프로그래머들은 현재 인기있는 OO 및 FP 언어를 포함 하여 현재 사용하고있는 도구의 기본 특성에 놀랄 것입니다.


55
20 년 전만 봐 프로그래밍이 많이 발전한 것은 아닙니다. 더 나은 도구가있을 수 있습니다. 아마도 새로운 언어 나 2이지만 근본적으로 크게 변하지는 않을 것입니다. 20 년 이상 걸릴 것입니다. 우리 모두는 2000 년에 우리가 날아 다니는 자동차를 보게 될 것이라고 생각했습니다. :)
bibac

32
O'Caml은 아일랜드 인입니다.
defmeta

7
@alex strange : "향상된 불변성"과 "부적절한 부작용"은 객체 지향 및 명령형 프로그래밍 학교에서 꽤 오랫동안 좋은 규칙이었습니다. (그래서 무엇을 좋아하지 않습니까? ;-)
joel.neely

101
@bibac : 20 년 전에 C 코드를 작성하고 Clipper 또는 Turbo Pascal의 장점에 대해 논의했습니다. 객체 지향은 학문의 독점 영역이었습니다. 약간의 변화가 있음을 제안하는 것은 터무니없는 말입니다.
Daniel C. Sobral

24
@Daniel : Clipper의 "장점"을 주장한 사람들의 목록을 제공해주십시오. 그들은 사냥을 당하고 정의를 가져와야합니다.
David

125

저에게있어 가장 큰 장점은 고유 병렬 처리입니다. 특히 우리는 더 많은 MHz에서 멀어지고 점점 더 많은 코어로 이동하고 있습니다.

나는 그것이 다음 프로그래밍 패러다임이 될 것이라고 생각하지 않으며 OO 유형 메소드를 완전히 대체 할 것이라고 생각하지만 기능적 언어로 코드를 작성해야하거나 범용 언어는 더 기능적인 구성을 포함하도록 성장하십시오.


4
우리는 이미 이런 일이 일어나고 있습니다. 그리고 앞으로 더 많은 일이 일어날 것입니다. 그래서 나는이 점에 100 % 동의합니다.
Jason Baker

까다로운 점은 병렬 처리에 적합하도록 FP의 공유 된 부작용이 아니며 부작용이 없다는 것입니다. OO 솔루션과 잘 맞지 않는 측면도 있습니다. 효과적인 하이브리드를 만드는 것은 매우 어렵습니다. OO 노드 사이에 FP 접착제가 있습니까?
James Brady

효과적인 하이브리드를 위해서는 D 프로그래밍 언어의 2.0 분기를 살펴보십시오. 현재 진행중인 알파 / 작업이지만 도착하고 있습니다.
dsimcha

2
나는이 대답이 흥미 롭다는 것을 알았습니다. 기능적 언어를 모르는 이유는 왜 병렬화에 더 적합한 것으로 간주됩니까?
andandandand

26
공유 데이터가 없기 때문에 함수에는 부작용이 없습니다. 당신이 걱정하는 것은 반환 값입니다. (이것은 OO / 프로 시저 프로그래머가 머리를 돌리는 것은 매우 어려운 생각입니다.) 따라서 한 함수의 출력이 다른 함수의 입력으로 사용되지 않는 한 많은 함수를 한 번에 호출 할 수 있습니다.
Tom Smith

79

함수형 언어로 전문적으로 작업하지 않아도 함수형 프로그래밍을 이해하면 더 나은 개발자가 될 수 있습니다. 일반적으로 코드와 프로그래밍에 대한 새로운 관점을 제공합니다.

나는 그것을 배울 이유가 없다고 말합니다.

기능적 스타일과 명령형 스타일을 잘 혼합 한 언어가 가장 흥미롭고 성공할 가능성이 높다고 생각합니다.


좋은 지적이지만 "어떻게하면 더 나은 개발자가
되겠는가

20
다른 프로그래밍 패러다임은 다른 각도에서 문제에 접근하며 종종 "다른 사고 방식"또는 사고 방식을 요구합니다. 그리고 여러 가지 다른 사고 방식으로 자신을 훈련시키는 것 (어떤 상황에서 어떤 것을 사용해야하는지 배우는 것)은 결코 나쁜 일이 아닙니다.
peSHIr

56

나는 항상 다음 큰 것에 대해 회의적입니다. 많은 경우 Next Big Thing은 기술의 유무에 관계없이 적시에 적절한 장소에 존재하는 순수한 역사의 사고입니다. 예 : C ++, Tcl / Tk, Perl. 모든 결함이있는 기술은 모두 오늘날의 문제를 해결하거나 확고한 표준과 거의 동일하거나 둘 다에 대해 인식 되었기 때문에 크게 성공했습니다. 함수형 프로그래밍은 실제로 훌륭 할 수 있지만 이것이 채택 될 것을 의미하지는 않습니다.

하지만 난 의 사람들이 왜 당신에게 흥분 함수형 프로그래밍에 대해 . 많은 프로그래머들이 함수형 언어를 사용하면 생산하는 동안 두 배의 생산성 (또는 아마도 10 배의 생산성)을 얻는 일종의 "변환 경험"을 경험했습니다. 변경하기에 더 탄력적이고 버그가 적은 코드. 이 사람들은 기능 프로그래밍을 비밀 무기로 생각합니다. 이 사고 방식의 좋은 예는 Paul Graham의 평균을 치는 것입니다. 입니다. 아, 그리고 그의 신청? 전자 상거래 웹 앱.

2006 년 초 이래로 함수형 프로그래밍과 병렬 처리에 대한 논쟁이있었습니다. 사람들이 좋아하기 때문에Simon Peyton Jones 은 적어도 1984 년 이후로 병렬 처리에 대해 걱정하고 있기 때문에 기능적 언어가 멀티 코어 문제를 해결할 때까지 숨을 쉬지 않습니다. 그러나 지금은 몇 가지 추가 버즈에 대해 설명합니다.

일반적으로 미국 대학은 기능 프로그래밍을 가르치는 일을 잘 못하고 있습니다. Scheme을 사용한 인트로 프로그래밍 교육에 대한 강력한 지원이 있으며 Haskell도 그에 대한 지원을 받고 있지만 기능 프로그래머를위한 고급 기술을 가르치는 방법은 거의 없습니다. 저는 하버드에서 그러한 과정을 가르쳤으며 올 봄 터프 츠에서 다시 할 것입니다. Benjamin Pierce는 Penn에서 그러한 과정을 가르쳤습니다. 폴 휴닥이 예일에서 무슨 짓을했는지 모르겠습니다. 유럽의 대학들은 훨씬 더 나은 일을하고 있습니다. 예를 들어 덴마크, 네덜란드, 스웨덴 및 영국의 중요한 장소에서는 기능 프로그래밍이 강조됩니다. 나는 호주에서 무슨 일이 일어나고 있는지에 대한 감각이 적습니다.


나는 영국 대학에 대해 모른다. 여기 많은 대학들이 아주 적은 프로그래밍 언어 (자바, C, 운이 좋으면 Perl)를 가르치는 것을 알게 될 것입니다. 최고의 (몇몇) 대학이 최고의 CS 프로그램을 가지고 있기 때문에 여기서 문제는 품질의 차이입니다.
Mike B

귀하가 제공 한 사례가 결함, 틈새 시장 또는 특정 지역에 적합하지만 대규모 학습 곡선없이 보편적으로 채택 될 수있는 일반적인 목적에 동의하지 않습니다. 그것이 아마도 그들이 성공한 가장 큰 이유 일 것입니다.
gbjbaanb

영국에서 유니 파스 (Pascal, C, Modula2, Cobol)에서 Forth와 Lisp를했지만 20 년 전이었습니다.
kpollock

29
나는 uni (호주)에서 Java / C ++을 배웠지 만, 몇몇 동료들은 Haskell에서 여러 대학을 다니고있는 다른 대학으로 갔다. 프로그래밍 소개와 마지막 해 단위 중 하나에 사용되었습니다. 내 동료가 처음으로 캐스팅을 소개 한 후 (이 시점에서 그는 Haskell 만 알고 있음) Java 강사에게 한 말을 들었을 때 웃었습니다. "뭐?! t 어떤 타입인지 아십니까 ? "
Jacob Stanley

1
팀의 모든 유럽인들과 함께 C #에서 무슨 일이 있었는지 살펴보십시오. :)
Benjol

32

나는 여기 방에서 코끼리를 언급하는 사람을 보지 못하므로 그것이 나에게 달려 있다고 생각합니다. :)

JavaScript는 기능적인 언어입니다. 점점 더 많은 사람들이 jQuery, Dojo 및 기타 프레임 워크의 미세한 지점을 활용하여 JS로 더 발전된 작업을 수행함에 따라 FP는 웹 개발자의 백도어에 의해 도입 될 것입니다.

클로저와 함께 FP는 JS 코드를 실제로 가벼우면서도 읽을 수있게 만듭니다.

건배, PS


2
이것이 제가 함수형 프로그래밍을 파기 시작한 방법입니다. Prototype.js의 list.Each (function (item) {}) 또는 jQuery의 전체 작동 방법보다 나은 것은 없습니다.
Cory R. King

20
자바 스크립트를 사용하면 기능적으로 프로그래밍 할 수 있습니다. 그러나 이것은 교차 패러다임 언어이므로 다양한 방식으로 프로그래밍 할 수 있습니다 (좋아요, 관련이 없습니다) ... OO, 기능, 절차 등
RHSeeger


jQuery 객체 메소드는 list 모나드에서 작동합니다. 컨테이너 (또는 시퀀스)를 나타내는 객체를 입력으로 가져 와서 객체 컨테이너를 출력으로 반환하는 것은 fmap의 실제 재발 명에 대한 좋은 예입니다.
Jared Updike

25

대부분의 응용 프로그램은 일반적인 OO 방식으로 해결할 수있을 정도로 간단합니다.

  1. OO 방식이 항상 "정상적인"것은 아닙니다. 이 10 년 표준은 지난 10 년간 소외된 개념이었습니다.

  2. 함수형 프로그래밍은 수학입니다. Lisp의 Paul Graham ( Lisp의 대체 기능 프로그래밍) :

따라서이 1950 년대 언어가 왜 구식이 아닌지에 대한 간단한 설명은 기술이 아니라 수학이며 수학이 부실하지 않다는 것입니다. Lisp를 비교하는 올바른 방법은 1950 년대 하드웨어가 아니라 1960 년에 발견 된 Quicksort 알고리즘인데, 여전히 가장 빠른 범용 정렬입니다.


25

나는 당신이 사용할 때 함수형 프로그래밍인지 몰랐다.

  • 엑셀 수식
  • 석영 작곡가
  • 자바 스크립트
  • 로고 (터틀 그래픽)
  • LINQ
  • SQL
  • Underscore.js (또는 Lodash), D3

10
Javascript는 어떻게 함수형 프로그래밍으로 간주됩니까?
Pacerier

8
그것은 일급 함수, 고차 함수, 클로저, 익명 함수, 부분적 적용, 카레 및 구성을 가지고 있습니다.
daniel1426

2
ㅋ. 일단 중첩 된 함수가있는 화면보다 넓은로드 상환 Excel 수식을 작성했습니다. 나는 일종의 기능적 프로그래밍을 알고 있었지만 아직 그 용어를 몰랐습니다.
ProfK

7
목록에 C를 추가하십시오
Mandeep Janjua

2
@MandeepJanjua : 응? 어떻게 오세요? 아니면 왜 어떤 언어가 아닌가?
Sz.

18

평범한 회사 프로그래머, 예를 들어 내가 일하는 대부분의 사람들은 그것을 이해하지 못하고 대부분의 작업 환경에서 프로그래밍을 할 수 없습니다

그래도 시간 문제 일뿐입니다. 평범한 기업 프로그래머는 현재 Big Thing이 무엇이든 학습합니다. 15 년 전에는 OOP를 이해하지 못했습니다. IF FP는 "평균 기업의 프로그래머는"따를에 잡는다.

그것은 실제로 대학에서 가르치지 않습니다 (또는 요즘입니까?)

많이 다릅니다. 우리 대학에서 SML은 학생들이 처음 접하는 언어입니다. 저는 MIT가 LISP를 1 년 과정으로 가르치고 있다고 생각합니다. 물론이 두 가지 사례는 대표적 일 수는 없지만 대부분의 대학은 교육 과정의 필수 부분이 아니더라도 FP에 대한 일부 선택 과목을 제공한다고 생각합니다.

대부분의 응용 프로그램은 일반적인 OO 방식으로 해결할 수있을 정도로 간단합니다.

그래도 "간단한"문제는 아닙니다. 해결책이 더 간단할까요?FP에서 하거나 읽기 쉽고 강력하고 우아하며 성능이 좋을까요? 많은 것들이 "자바로 풀기에 충분히 간단하다"지만 여전히 엄청난 양의 코드가 필요하다.

어쨌든 FP 지지자들은 그것이 수십 년 동안 그 다음 큰 일이라고 주장했다는 것을 명심하십시오. 아마도 그들이 옳을 지 모르지만 5, 10 또는 15 년 전에 같은 주장을 할 때가 아니라는 것을 명심하십시오.

하지만 C #이 최근에 프로그래머를 눈에 띄지 않고 실제로 FP 프로그래머로 전환하는 정도까지 FP를 향해 급격한 변화를 겪었다는 점에서 분명히 유리 합니다 . 그것은 FP "혁명"을위한 길을 열어 줄 것입니다. 아마도. ;)


MIT 는 인트로 CS 과정에서 Scheme을 가르치는 데 사용 되었지만 지금은 Python을 사용합니다.
mipadi

1
"15 년 전에는 OOP를 이해하지 못했습니다"-문제는 15 년 전에는 FP도 이해하지 못했다는 것입니다. 그리고 그들은 여전히 ​​오늘이 아닙니다.
Jason Baker

15

사람이 다른 예술의 가치를 볼 수 없다면, 자신이 선택한 예술의 완벽과 불완전 성을 이해할 수 없습니다. 규칙을 준수하면 기술의 특정 지점까지만 개발할 수 있으며 학생과 아티스트는 더 많은 것을 배우고 더 추구해야합니다. 전략뿐만 아니라 다른 예술도 공부하는 것이 합리적입니다.

다른 사람의 활동을보고 자신에 대해 더 배우지 않은 사람은 누구입니까? 칼을 배우려면 기타를 연구하십시오. 주먹 연구 상거래를 배우기 위해. 칼을 연구하는 것만으로도 마음이 좁아지고 바깥으로 자라지 못하게됩니다.

-미야모토 무사시, "5 개의 반지의 책"


12

기능적 언어의 주요 기능 중 하나는 일류 기능의 개념입니다. 아이디어는 함수를 다른 함수에 매개 변수로 전달하여 값으로 리턴 할 수 있다는 것입니다.

함수형 프로그래밍에는 상태를 변경하지 않는 코드 작성이 포함됩니다. 이렇게하는 주된 이유는 함수를 연속적으로 호출하면 같은 결과를 얻을 수 있기 때문입니다. 일급 함수를 지원하는 모든 언어로 기능 코드를 작성할 수 있지만 Haskell과 같은 일부 언어는 상태를 변경할 수 없습니다. 실제로, 텍스트 인쇄와 같은 부작용은 전혀 없어야합니다. 완전히 쓸모없는 것처럼 들립니다.

Haskell은 IO에 대한 다른 접근 방식 인 모나드를 사용합니다. 인터프리터의 최상위 레벨에서 실행할 원하는 IO 작업이 포함 된 객체입니다. 다른 수준에서는 시스템의 객체 일뿐입니다.

기능적 프로그래밍은 어떤 이점을 제공합니까? 함수형 프로그래밍은 각 구성 요소가 완전히 분리되어 있기 때문에 버그 발생 가능성이 적은 코딩이 가능합니다. 또한 재귀 및 일류 함수를 사용하면 일반적으로 코드 구조를 반영하는 간단한 정확성 증명이 가능합니다.


12

대부분의 현실적인 사람들은 함수형 프로그래밍이 따라 잡을 것이라고 생각하지 않습니다 (OO와 같은 주요 패러다임이 됨). 결국 대부분의 비즈니스 문제는 수학 문제가 아니라 데이터를 이동하고 다양한 방식으로 표시하는 털이 많은 규칙입니다. 따라서 순수한 기능 프로그래밍 패러다임에 적합하지 않습니다 (모나드의 학습 곡선이 OO를 훨씬 초과 함).

OTOH, 함수형 프로그래밍은 프로그래밍을 즐겁게 만듭니다. 그것은 우주의 기초 수학의 간결한 표현의 본질적이고 영원한 아름다움을 높이 평가합니다. 사람들은 함수형 프로그래밍을 배우면 더 나은 프로그래머가 될 것이라고 말합니다. 이것은 물론 매우 주관적입니다. 나는 개인적으로 그것이 완전히 사실이라고 생각하지 않습니다.

그것은 당신에게 더 나은 지각력을줍니다.


6
OO가 본질적으로 FP보다 쉽다고 생각하지 않습니다. 그것은 실제로 당신의 배경에 달려 있습니다 (나는 수학 사람입니다, 내가 더 쉽게 찾은 것 같아요? :)
temp2290

14
모나드는 이해하기 어렵지 않습니다. 그 헛소리에 사지 마십시오.
Rayne

-1 OOP는 FP보다 단단합니다.
누군가

-1 FP가 수학 문제에만 적합하다면 OCaml 또는 Haskell을 사용하여 최적화 컴파일러를 작성하지 않습니다.
gracchus

8

나는 조밀해야하지만 여전히 얻지 못합니다. F #과 같은 기능적 언어로 작성된 작은 앱의 실제 예제가 있습니까? 여기서 소스 코드를보고 C #보다 그러한 접근 방식을 사용하는 것이 어떻게, 왜 더 나은지 알 수 있습니까?


좋은 말 +1. @ Mendelt : "더 접근성"? 코드를 볼 때 두통이 더 빠르다는 것을 의미합니까?
Patrick Honorez

2
이 F # 라이브러리 ( quanttec.com/fparsec/tutorial.html)를 참조하십시오 . C #에서 동일한 명령어로 컴파일 된 경우에도 F # 코드의 절반만큼 우아하고 읽기 쉬운 파서가있는 샘플 코드를보고 싶습니다. FParsec을 F #에서 C #으로 포팅하고 코드가 어떻게 팽창하는지 확인하십시오.
Jared Updike

8

함수형 언어에 대해 말한 모든 것, 대부분의 사람들은 약 20 년 전에 객체 지향 언어에 대해 말하고있었습니다. 당시에는 OO에 대해 듣는 것이 매우 일반적이었습니다.

* The average corporate programmer, e.g. most of the people I work with, will not understand it and most work environments will not let you program in it
* It's not really taught at universities (or is it nowadays?)
* Most applications are simple enough to be solved in normal IMPERATIVE ways

어딘가에서 변화가 이루어져야합니다. 의미 있고 중요한 변화는 초기 기술 훈련을받은 사람들이 변화가 필요하지 않다는 의견을 가지고 있는지 여부에 관계없이 발생합니다. 당시에 반대했던 모든 사람들에도 불구하고 OO 로의 변경이 좋았다고 생각하십니까?


2
* 평균 기업 프로그래머, 예를 들어, 대부분의 나는 함께 일하는 사람들, 그것을 이해되지 않으며 대부분의 작업 환경은 당신이 그것에 프로그램 못하게 - 그건 아직 그들이 (물론 :) 내가 작업 한 많은 장소에서 OOP의 진정한 그들은 OOP를하고 있지만, 그렇지 않습니다)
tolanj

7

Microsoft가 추진하고 있기 때문에 F #은 따라 잡을 수 있습니다.

찬성:

  • F #은 Visual Studio의 다음 버전의 일부가 될 것입니다
  • Microsoft는 현재 전도사, 서적, 유명 고객과 함께 일하는 컨설턴트, MS 컨퍼런스에 대한 상당한 노출과 같은 커뮤니티를 구축하고 있습니다.
  • F #은 일류 .Net 언어이며 실제로 큰 기반을 가진 최초의 기능적 언어입니다. (Lisp, Haskell, Erlang, Scala, OCaml에는 라이브러리가 많지 않다는 말이 아닙니다. .Net만큼 완벽하지는 않습니다. 이다)
  • 병렬 처리에 대한 강력한 지원

대조 :

  • F #은 C #과 .Net에 능숙하더라도 시작하기가 매우 어렵습니다.
  • 좋은 F # 개발자를 찾기 어려울 것입니다.

그래서 저는 F #에게 50:50의 기회를주었습니다. 다른 기능적 언어는 가까운 장래에 그것을 만들지 않을 것입니다.


6
스칼라는 JRE와의 아주 깊은 기초라고 주장합니다.
cdmckay

2
라이브러리와 관련하여 실제로 수행중인 작업에 따라 다릅니다. F #은 금융 부문을 대상으로하며 과학 컴퓨팅에도 적용 할 수 있지만 실제로 OCaml은 .NET보다 이러한 응용 프로그램에 대한 라이브러리가 훨씬 우수합니다. 예를 들어, OCaml에서 F #에 왔을 때 괜찮은 FFT를 찾지 못하고 C #에서 F #을 작성하고 판매했습니다.
Jon Harrop

1
LINQ는 C # 및 VB.Net에서 기능적 개념을 사용하는 좋은 다리입니다 ... 그리고 F #과 비교할 때 읽는 것이 훨씬 덜 고통 스럽습니다.
Matthew Whited

5

한 가지 이유는 어떤 사람들은 언어를 받아 들일 것인지의 가장 중요한 부분이 언어가 얼마나 좋은지 생각한다고 생각하기 때문 입니다 . 불행히도 상황이 그렇게 간단하지는 않습니다. 예를 들어, 나는 (즉하지만 파이썬의 수용 뒤에 가장 큰 요인은 언어 자체 아니라고 주장 이다 매우 중요합니다). 파이썬이 인기있는 가장 큰 이유는 거대한 표준 라이브러리와 더 큰 타사 라이브러리 커뮤니티입니다.

Clojure 또는 F #과 같은 언어는 JVM / CLR을 기반으로한다는 점을 고려할 때 예외가 될 수 있습니다. 결과적으로 나는 그들에 대한 대답이 없습니다.


+1하지만 마케팅의 힘과 회사의 레거시 코드 산이 멋진 새로운 트렌드로 인해 언어를 전환하지 않는다는 사실을 잊지 마십시오.
temp2290

그리고 구글은 파이썬을 대중화하고 있습니다.
Hao Wooi Lim 2016

4

대부분의 응용 프로그램은 [원하는 언어, 패러다임 등을 여기에 삽입하십시오]에서 해결할 수 있습니다.

그러나 이것은 사실이지만 다른 도구를 사용하여 다른 문제를 해결할 수 있습니다. 기능은 올바르게 사용될 때 작업을보다 효과적으로 수행 할 수있는 또 다른 높은 (높은 수준의) 추상화를 허용합니다.


4

학부 시절 Lisp 또는 Scheme을 배우지 않은 사람들이 지금 그것을 발견하고있는 것 같습니다. 이 분야의 많은 것들과 마찬가지로 과대 기대와 높은 기대를 만드는 경향이 있습니다 ...

통과 할 것이다.

함수형 프로그래밍은 훌륭합니다. 그러나 세계를 인수하지는 않습니다. C, C ++, Java, C # 등은 계속 남아 있습니다.

이 기능은 기능 언어로 사물을 구현 한 다음 다른 언어로 그 사물에 액세스하는 등 언어 간 능력이 더 중요하다고 생각합니다.


1
C #은 이제 일급 어휘 클로저를 가지고 있기 때문에 Lisp와 같은 기능적 프로그래밍 언어입니다. 실제로, 이들은 이미 WPF 및 TPL에서 사용됩니다. 따라서 함수형 프로그래밍은 이미 여기에 있습니다.
Jon Harrop


3

한동안 기능적인 방향으로 움직이고 있습니다. 지난 몇 년간의 멋진 신입생 루비 (Ruby)와 파이썬 (Python)은 이전보다 기능 언어에 근본적으로 더 가까워 일부 Lispers가 "충분히 가깝게"지원하기 시작했습니다.

그리고 대규모 병렬 하드웨어로 인해 모든 사람과 기능적 언어가 변화를 처리하기에 가장 좋은 위치에 진화 압력이 가해지면서 Haskell 또는 F #이 다음으로 큰 것이라고 생각하는 것만 큼 비약 한 것은 아닙니다.


3

최근 프로그래밍 언어의 진화를 따르고 있습니까? 모든 주류 프로그래밍 언어의 모든 새로운 릴리스는 함수형 프로그래밍에서 점점 더 많은 기능을 빌리는 것 같습니다.

  • 클로저, 익명 함수, 전달 및 반환 함수는 Lisp 및 ML 해커에게만 알려진 이국적인 기능이었습니다. 그러나 점차 C #, Delphi, Python, Perl, Javascript는 클로저에 대한 지원을 추가했습니다. 다가오는 언어를 폐쇄하지 않고 진지하게 받아 들일 수는 없습니다.

  • Python, C # 및 Ruby와 같은 여러 언어는 목록 이해 및 목록 생성기를 기본적으로 지원합니다.

  • ML은 1973 년에 제네릭 프로그래밍을 개척했지만 제네릭 ( "파라 메트릭 다형성")에 대한 지원은 지난 5 년 동안 업계 표준이되었습니다. 올바르게 기억한다면 Fortran은 2003 년에 제네릭을 지원했고, Java 2004, 2005 년에 C #, 2008 년에 Delphi를 지원했습니다. (C ++은 1979 년부터 템플릿을 지원했지만 C ++의 STL에 대한 토론의 90 %는 "여기에는 악마가 있습니다" .)

이러한 기능이 프로그래머에게 매력적인 이유는 무엇입니까? 그것은 분명 명백해야한다 : 그것은 프로그래머가 짧은 코드를 작성하는 데 도움이 . 앞으로 모든 언어는 경쟁력을 유지하려는 경우 최소한 폐쇄를 지원할 것입니다. 이와 관련하여 기능 프로그래밍은 이미 주류에 있습니다.

대부분의 응용 프로그램은 일반적인 OO 방식으로 해결할 수있을 정도로 간단합니다.

간단한 것에는 함수형 프로그래밍을 사용할 수 없다고 누가 말합니까? 모든 기능 프로그램이 컴파일러, 정리 증명 자 또는 대규모 병렬 통신 스위치 일 필요는 없습니다. 나는 더 복잡한 프로젝트 외에 임시 스크립트를 위해 정기적으로 F #을 사용합니다.



3

링크가 열리지 않습니다. 오류 403.
Alexey Frunze


연결이 끊어졌습니다. 그렇기 때문에 이러한 종류의 답변은 인용뿐만 아니라 연결에도 불리합니다.
Sylwester

링크를 수정했습니다. @Sylwester는 사실이지만 23 페이지의 문서입니다. 이 사이트에 답하기 위해 종이를 내려 놓는 것은 정의가 아닙니다.
grom

2

첫 번째 요점에 동의하지만 시간이 바뀝니다. 기업은 채택자가 늦어도 이점이 있다고 판단되면 이에 대응할 것입니다. 인생은 역동적입니다.

그들은 90 년대 후반 스탠포드에서 하스켈과 ML을 가르치고있었습니다. Carnegie Mellon, MIT, Stanford 및 기타 좋은 학교와 같은 곳에서 학생들에게 제공하고 있습니다.

나는 대부분의 "웹에 관계형 데이터베이스 노출"앱이 오랫동안 그 맥락에서 계속 될 것이라는 데 동의합니다. Java EE, .NET, RoR 및 PHP는이 문제에 대한 훌륭한 솔루션을 발전 시켰습니다.

중요한 것을 발견했습니다. 기능 프로그래밍을 향상시키는 다른 방법으로는 쉽게 해결할 수없는 문제 일 수 있습니다. 그게 뭐야?

대규모 멀티 코어 하드웨어 및 클라우드 컴퓨팅이이를 지원할까요?


2

FP는 생산성, 안정성 및 유지 관리 측면에서 상당한 이점을 갖습니다. 많은 코어는 많은 양의 레거시 코드에도 불구하고 대기업이 마침내 전환하게하는 킬러 앱일 수도 있습니다. 동시성 및 병렬 처리에 적합하지 않습니다.

나는 "정상적인"프로그래머들이 그것을 이해하지 못한다는 것에 동의하지 않습니다. 그들은 결국 OOP를 이해하는 것처럼 (이상하지는 않지만 신비 롭고 이상합니다).

또한 대부분의 대학은 FP를 가르치고 있으며, 많은 사람들이 FP를 첫 번째 프로그래밍 과정으로 가르칩니다.


죄송하지만 FP는 OOP보다 약 3 배 정도 오래 걸렸습니다. 이것은 단순히 더 많은 시간이 필요한 문제가 아닙니다. FP 주류를 만들려면 더 많은 것이 필요합니다.
Jason Baker

"더 많은 것"이 많은 코어가 될 수 있다고 설명하는 내 게시물 부분을 어떻게 놓칠 수 있습니까? 그리고 "주변"은 실제로 관련이 없습니다. 사람들은 OOP가 당시 실질적인 이점을 제공했기 때문에 OOP를 이해했으며 FP는 최근에야 실용화되었습니다.
Sebastian

2

와우-이것은 흥미로운 토론입니다. 이것에 대한 내 자신의 생각 :

FP는 일부 작업을 비교적 단순하게합니다 (FP 언어가 아닌 언어와 비교). None-FP 언어는 이미 FP에서 아이디어를 얻기 시작하고 있으므로 이러한 추세가 계속 될 것으로 예상되며 사람들이 FP로 쉽게 도약하는 데 도움이 될 더 많은 합병을 보게 될 것입니다.


2

나는 그것이 붙잡을 지 모르겠지만, 내 조사에서 기능적 언어는 거의 확실히 배울 가치가 있으며, 더 나은 프로그래머가 될 것입니다. 참조 투명성을 이해하는 것만으로도 많은 디자인 결정이 훨씬 쉬워지고 결과 프로그램이 추론하기가 훨씬 쉬워집니다. 기본적으로 문제가 발생하면 수백 가지 클래스 / 메소드 / 함수 중 하나로 인해 발생할 수있는 불일치 상태의 문제가 아닌 단일 함수의 출력에만 문제가되는 경향이 있습니다. 부작용이있는 비대칭 언어로.

FP의 Stateless 특성은 웹의 Stateless 특성에보다 자연스럽게 매핑되므로 기능적 언어는보다 우아하고 편안한 웹앱에보다 쉽게 ​​적합합니다. VIEWSTATE 및 SESSION 키와 같이 엄청나게 추악한 HACKS를 사용하여 애플리케이션 상태를 유지하고 웹과 같이 기본적으로 상태가없는 기능적 플랫폼에서 상태 기반 명령 언어의 (종종 누출이 많은) 추상화를 유지해야하는 JAVA 및 .NET 프레임 워크와 대조하십시오.

또한 상태 비 저장 응용 프로그램이 많을수록 병렬 처리에 더 쉽게 빌려줄 수 있습니다. 귀하의 웹 사이트가 인기를 얻는 경우 웹에 매우 중요합니다. 더 나은 성능을 얻기 위해 사이트에 더 많은 하드웨어를 추가하는 것이 항상 쉬운 것은 아닙니다.


2

내 견해는 Microsoft가 주류로 훨씬 더 밀어 넣었 기 때문에 이제는 따라 잡을 것이라고 생각합니다. 저에게는 그것이 우리를 위해 할 수있는 일, 새로운 도전과 미래를 위해 재전송하는 직업 기회 때문에 매력적입니다.

일단 마스터하면 프로그래머로서의 생산성을 높이는 데 도움이되는 또 다른 도구가 될 것입니다.


2

토론에서 빠뜨린 요점은 최고의 유형 시스템이 현대 FP 언어로 발견된다는 것입니다. 또한 컴파일러는 모든 (또는 적어도 대부분의) 유형을 자동으로 유추 할 수 있습니다.

Java를 프로그래밍 할 때 유형 이름을 작성하는 데 절반의 시간을 소비하지만 Java가 유형에 안전하지 않다는 것은 흥미 롭습니다. Haskell 프로그램에서 유형을 작성할 수는 없지만 (컴파일러 확인 문서의 종류는 제외) 코드는 100 % 유형 안전합니다.


1

다른 답변 외에도 솔루션을 순수한 기능 용어로 캐스팅하면 문제를 더 잘 이해할 수 있습니다. 반대로, 기능적인 스타일로 생각하면 더 나은 * 문제 해결 기술을 개발할 수 있습니다.

* 기능적 패러다임이 더 좋거나 추가적인 공격 각도를 제공 할 수 있기 때문입니다.

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