함수형 프로그래밍 언어는 언제 사용합니까?


90

어떤 상황에서 C ++, C # 또는 Java와 같은보다 장황한 객체 지향 언어보다 함수형 프로그래밍 언어를 사용하도록 선택해야합니까?

나는 함수형 프로그래밍이 무엇인지 이해하고, 내가 정말로 이해하지 못하는 것은 어떤 유형의 문제에 대한 완벽한 해결책인가?


이 질문에 대한 답변은 여기 stackoverflow.com/questions/381685/…
krosenvold 2008-12-29

2
항상. 아니면 적어도 절대로.
Shelby Moore III

1
람다를 사용하면 C #이 경계선 기능을합니다.
JD

답변:


51

제 생각에 기능적 언어는 주로 게임 AI와 수학적 계산이라는 두 가지에 유용합니다. 좋은 목록 조작 (적어도 Lisp 및 Scheme에서는)과 구문으로 인해 수학적 계산에 적합하기 때문에 게임 AI에 적합합니다. Scheme, Lisp 및 Haskell에는 수학적 계산을 쉽게 읽을 수있는 구문이 있습니다. 마지막으로 추가해야 할 것은 기능적 언어가 정말 재미있는 언어라는 것입니다. 나의 Scheme 과정은 내가 가장 재미있게했던 과정 중 하나였습니다.


2
Scheme에서 수강 한 컴파일러 수업 첫 주에 뇌가 폭발하기를 원한다는 사실을 알게 된 후, Scheme도 수강했습니다. (그리고 훨씬 더 잘해졌습니다)
Alex Baranosky

1
수학적 계산에 어떤 기능적 언어를 사용 했습니까?
Jules

8
또한 컴파일러! Haskell에서 컴파일러를 작성한 사람들이 "다시는 명령형 언어로 컴파일러를 작성하지 않을 것"이라고 말하는 것을 들었습니다.
ShreevatsaR

1
julesjacobs : 간단한 수학적 계산을 해결하기 위해 haskell과 Scheme을 모두 사용했습니다. 나는 그 언어를 전혀 잘하지 못하기 때문에 더 복잡한 문제를 해결할 방법이 있습니다. 지금까지는 충분히 빠르게 만들 수 없습니다.
martiert

96

나는 이것에 대해 약간의 조사를 해왔고 기능적 언어를 사용하는 이유 목록에 CONCURRENCY를 추가 할 것이라고 생각했습니다. 가까운 장래에 프로세서 속도는 동일한 CPU 기술을 사용하여 증가 할 수 없을 것입니다. 건축의 물리학은 그것을 허용하지 않을 것입니다.

그래서 동시 처리가 시작됩니다.

불행히도 대부분의 OOP 언어는 데이터 간의 상호 의존성 때문에 한 번에 여러 프로세서를 활용할 수 없습니다.

순수 함수형 프로그래밍 언어에서 컴퓨터는 두 가지 (또는 그 이상) 함수를 한 번에 실행할 수 있습니다. 이러한 함수는 외부 상태 정보를 변경하지 않기 때문입니다.

다음은 여러분이 즐길 수있는 함수형 프로그래밍에 대한 훌륭한 기사 입니다.


38
나는 대부분의 OO 언어가 임의로 많은 수의 프로세서를 이용할 수 없다고 말하지 않을 것입니다. 프로그램이 효율적이고 신뢰할 수있는 방식으로 동시에 많은 프로세서를 활용하려면 대부분의 계산 집약적 인 코드 단위가 순수 함수처럼 작동하도록 구성되어야합니다. 대부분의 언어로 프로그램을 구성하는 것이 가능합니다. 명령형 (객체 지향 포함) 언어보다 기능적 언어에서 수행하는 것이 더 쉽습니다.
Zak

2
해당 기사를 링크 해주셔서 감사합니다. 저에게 정말 도움이되었습니다.
guptron 2014

13

내 친구는 그의 대학 교수 중 한 명이 다음과 같이 말한 것으로 인용했습니다.

상단에는 데이터 유형이 있고 왼쪽에는 해당 데이터 유형에 대한 작업이 포함 된 그리드를 그립니다. 그리드를 수직으로 자르면 OO를하는 것입니다. 그리드를 수평으로 자르면 FP를 수행하는 것입니다.

내 대답은 FP가 OO만큼 광범위한 응용 프로그램을 사용하여 프로그래밍에 대한 완전히 실행 가능한 접근 방식이라는 것입니다. 프로그래밍 언어 선택 토론과 마찬가지로 더 중요한 질문은 다음과 같습니다.

  1. 새로운 표기법과 새로운 사고 방식을 배우는 데 투자 할 시간이 있습니까?
  2. 고려중인 언어 중 어느 것이 휠을 재발 명하지 않을만큼 충분히 풍부한 라이브러리를 가지고 있습니까?

첫 번째 질문에 대해 학습 가치를 위해이 작업을 수행하는 경우 다양한 지원 자료 (책, 기사, 활발한 커뮤니티 등) 때문에 Haskell을 살펴 보는 것이 좋습니다 .

두 번째 질문과 관련하여 Haskell은 다양한 라이브러리를 보유하고 있지만 (일부는 다른 것보다 성숙했지만) Scala (JVM에서 실행되는 하이브리드 OO 기능 언어)는 점차적으로 기능적 스타일로 전환 할 수있는 장점이 있습니다. , 사용 가능한 모든 범위의 Java 액세스 가능 라이브러리가 있습니다.


저는 대학에서 Scheme을 배웠기 때문에 경험을 위해 함수형 프로그래밍을 배우고 싶지 않습니다. 나는 실용적인 이유로 기능적인 언어를 배우고 싶습니다.
Alex Baranosky

9

실제로 PP에서 할 수있는 모든 작업은 FP에서 수행 할 수 있으며 그 반대도 마찬가지입니다. 이는 문제에 대한 또 다른 관점과 문제를 해결하는 다른 방법으로 무언가를 코딩하는 또 다른 방법 일뿐입니다.

그러나 FP를 사용하는 사람이 많지 않기 때문에 문제는 좋은 라이브러리의 부족, 이식성 / 유지 보수성 (관리자가 Scheme보다 C ++로 작성된 것을 이해할 수있는 더 나은 기회를 가지기 때문에), 문서 및 커뮤니티의 부족에 관한 것입니다. 일부 문서가 있지만 C ++, C # 또는 Java와 비교하면 내가 의미하는 바를 이해할 수 있습니다.

그러나 정말로 FP를하고 싶다면 C ++과 C #에서도이 스타일을 사용할 수 있습니다. 물론 표준 라이브러리를 사용하면 100 % FP가 아닙니다. 불행히도 나는 C #이 함수형 프로그래밍과 함께 사용되도록 최적화되어 있지 않다고 생각하며 아마도 많은 성능 문제를 일으킬 것입니다.

이것은 내가 FP에 대해 생각하는 더 주관적인 게시물입니다. 엄격한 선언이 아닙니다.


8
"실질적으로 PP에서 할 수있는 모든 것은 FP에서 할 수 있습니다." -사실, 그것은 정확히 모든 것입니다.
BlueRaja-Danny Pflughoeft 2010

2
@BlueRaja-튜링 완전성을 언급하고 있습니까? 그렇다면 당신의 말은 따르지 않습니다. 예를 들어 Conway의 Game of Life는 Turing Complete이지만 C 에서처럼 비디오 카드 드라이버를 작성하는 데 사용할 수 없습니다. 마찬가지로 Haskell로 작성된 최신 게임을 볼 수 없습니다. FP에서 할 수 있습니다! = 이론적으로 FP에서 할 수 있습니다.
Luigi Plinge

@Luigi Plinge BlueRaja에 동의해야합니다. Haskell로 작성된 일부 Linux 드라이버를 논의하는 Haskellers. 링크는 없지만 OS가 Haskell로 작성되었다고 들었습니다 (다른 기능 언어도 가능). 게임이 진행되는 한 최신 게임이 C # 또는 Java로 작성되는 것을 보지 못합니다. 게임에 사용할 수 없다는 의미입니까? 어쨌든 FP로 작성된 게임의 예입니다. 또한 내 링크의 대부분은 순수하게 기능하는 언어 인 Haskell이라는 것을 명심하십시오.
austinprete 2011-06-28

@PardonMyRhetoric 분명히 Haskell에서 게임을 작성하고 어떤 계산도 할 ​​수 있지만 속도는 몇 배 더 느리고 메모리 사용량은 더 높습니다. 따라서 BlueRaja의 진술에 대한 반례는 FP에서 "C에있는만큼 빠르고 많은 메모리를 사용하는 게임"을 작성할 수 없다는 것입니다. 이것은 현학적 인 트릭이 아니라 실제적인 문제입니다. (그리고 저는 FP를 전혀 공격하지 않습니다. 지금 스칼라를 코딩하고 있습니다!).
Luigi Plinge 2011-06-28

1
@PardonMyRhetoric 또한 관용적 FP 여야합니다. C의 성능에 근접한 Haskell 성능을 제공하는 벤치 마크는 대부분의 Haskell 프로그래머가 작성할 수없는 "낮은 수준"의 일관된 스타일로 작성됩니다. 예를 들어 단순히 Haskell 코드를 출력하고 C 코드를 컴파일하여 유사한 성능을 얻을 수 있습니다. 그래도 무의미합니다. 관련된 실질적인 문제는 "할 수있는 것"과 "할 수있는 것 / 할 수있는 것"입니다. 무언가가 너무 어렵다면 이론상 가능한지 (그리고 누구를 위해 "가능"합니까?)별로 중요하지 않습니다.
Luigi Plinge 2011 년

4

기능적 언어는 많은 상황에서 좋습니다. 특정 기능 언어의 라이브러리에 따라 다릅니다.

"객체 지향 프로그래밍 언어를 언제 사용해야합니까?"라는 질문에 어떻게 대답 하시겠습니까?


1
"객체 지향 프로그래밍 언어를 언제 사용해야합니까?" 당신이 어떤 것을 계산적으로 모델링하고 싶을 때, 나는 fp가 직관적 인 asnswer가 될 것이라는 문제를 찾고 있었지만, 나는 이것이 내가이 포스트를 찾은 방법입니다.
jimjim

@Arjang 나는 함수형 프로그래밍이 출력을 생성하기 위해 입력 만 필요한 계산 응용 프로그램에서 엄청난 사용을 찾을 것이라고 생각합니다. 어떤 가변성하지없이 반복
EdgeDev

3

이것은 매우 주관적인 질문이지만 기능적 언어가 도메인 특정 언어 를 구문 분석하는 데 많이 사용된다는 점을 덧붙이고 싶습니다 . 기능적 특성은 구문 분석 문법에 적합합니다.


2
DSL 구문 분석? Lisp 매크로 등을 사용하여 DSL은 Lisp 프로그램에서 구문 분석 할 수있는 것이 아니라 매크로 로 구현 됩니다 . 비 Lisp 언어를 사용한 YMMV. :-P
Chris Jester-Young

1

내가 본 바에 따르면 기능성보다는 맛의 문제입니다 (말장난 의도 없음). 특정 작업에서 본질적으로 더 좋거나 나쁘게 만드는 언어 스타일에 대해서는 실제로 아무것도 없습니다.


2
@JonHarrop-자세히 설명 하시겠습니까? 나는 그것이 그렇게 명백하지 않다는 것을 알지 못하며, 부스터 리심에서 사람들을 투표했다는 인상을 남겼다면 부끄러 울 것입니다.
TED

1
ML 계열 언어는 특히 트리 (예 : 표현 트리)를 조작하기위한 패턴 일치와 같은 정교한 언어 기능을 추가하여 메타 프로그래밍을 위해 만들어졌습니다. 결과적으로이 언어 계열은 본질적으로 특정 작업에서 훨씬 더 우수합니다.
JD

1
@JonHarrop-동의합니다. 그러나 일반적으로 기능적 언어가 아닌 ML에 대해 이야기하고 있습니다. 저는 DSL을 매우 믿기 때문에 설계 한 정확한 작업에 특정 언어를 사용하는 것에 반대하지 않을 것입니다.
TED

오늘날 패턴 매칭은 OCaml, F #, Scala, Haskell, Clojure 및 Erlang을 포함한 거의 모든 기능 언어에서 발견됩니다. 예를 들어, 저는 최근에 수학에 초점을 맞춘 고객을위한 맞춤형 비즈니스 규칙 엔진을 구축했습니다. 이는 1,000 줄의 F #이며 주로 인터프리터입니다. 패턴 매칭 덕분에 Lexing, 구문 분석, 유형 검사 및 입력 해석이 훨씬 쉬워졌습니다.
JD

@JonHarrop ..하지만 전부는 아닙니다. 질문이 묻고 있던 기능적 언어의 고유 한 특징이 아닙니다.
TED

1

일반적으로 문제에 대한 해결책을 표현하기 가장 쉬운 언어를 사용하십시오. 함수형 프로그래밍의 경우 문제에 대한 솔루션이 함수 측면에서 쉽게 표현 되므로 이름이됩니다. 일반적으로 수학적 연산, AI, 패턴 매칭에 좋습니다. 일반적으로 답변을 얻기 위해 적용해야하는 일련의 규칙으로 세분화 할 수있는 모든 것. 문제를 충분히 분석 한 후에 만 ​​사용할 "최상의"언어를 결정할 수 있습니다. 이것은 의사 코드가 유용한 곳입니다. FP처럼 보이는 의사 코드를 작성하는 경우 FP를 사용하십시오.

물론 모든 완전한 프로그래밍 언어는 기능적으로 동일하므로 어떤 문제를 해결할 수 있는지에 따라 어떤 언어를 선택하는지는 중요하지 않습니다. 주요 효과는 코딩 효율성과 정확성, 유지 관리 용이성 측면에서 발생합니다.

또한 영리하게 설계된 API를 통해 OO 언어 내에서 FP를 모방 할 수 있습니다. 예를 들어, FP DSL을 시뮬레이션하기 위해 메소드 체인을 사용하는 수많은 Java 라이브러리 (JMock이 한 예)를 보았습니다. 그러면 다음과 같은 구조가 표시됩니다.

logger.expects(once()).method("error") .with( and(stringContains(action),stringContains(cause)) );

이것은 본질적으로 모의 객체에 대한 일부 호출 시퀀스가 ​​올바른지 여부를 결정하기 위해 평가되는 함수를 빌드합니다. ( http://www.jmock.org/yoga.html 에서 도난당한 예 )

OO 언어의 또 다른 FP와 유사한 구문은 Ruby와 같은 클로저 사용입니다.


2
"... 해결할 수있는 문제의 관점에서 어떤 것을 선택 하느냐는 정말 중요하지 않습니다." 문제를 해결할 시간과 돈이 무한 할 때만 가능합니다.
JD
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.