기능 프로그래밍이 어떤 일반적인 문제에 적합하지 않습니까? [닫은]


22

함수형 프로그래밍은 선언적 패러다임입니다. FP의 장점 중 하나는 부작용을 피할 수 있다는 것입니다. 일부 문제의 경우 FP가 적합하지 않다고합니다.

기능 프로그래밍이 적합하지 않은 일반적인 문제는 무엇입니까?


아휴! 잠시 동안 나는 당신이 " 불완전한 패러다임"이라고 말했다. 그런 다음 돌아와서 확인했습니다.
Mark C

1
나는 부작용이 피할 수없는 것보다 (하스켈에서) 격리되어 있다고 말하는 것이 더 정확하다고 생각합니다. 모나드는 상태 변경을 허용하며 하나는 "상태"라고도합니다.
Larry Coleman

Larry Coleman이 설명했듯이 함수형 프로그래밍이 부작용을 피한다는 것은 사실이 아니지만 사용을 방해하고 일부 언어에서는 명확하게 분리합니다. 예 : research.microsoft.com/en-us/um/people/simonpj/papers/…
Giorgio

답변:


17

본질적으로 매우 상태가 좋은 응용 프로그램. 비디오 게임은 실제 세계를 모델링하기 때문에 좋은 예입니다. 무언가가 바뀔 때마다 이전 상태에서 다시 작성하는 대신 세계 상태를 수정하는 것에 대해 생각하는 것이 훨씬 더 합리적입니다.

구체적인 예는 몬스터가 총에 맞은 후 체력을 바꾸는 것입니다. 체력이 적은 것을 제외하고는 모든면에서 똑같은 완전히 새로운 괴물로 대체하는 것보다 단순히 체력을 바꾸는 것이 훨씬 합리적입니다. 이러한 종류의 변화는 게임 세계의 모든 것을 구성하며 순수한 기능 방식으로 수행하는 것은 그리 직관적이지 않습니다. 최소한 순전히 기능적인 언어로 수행하는 경우 상당한 성능 저하가있을 수 있습니다.

참고로 게임의 일부 문제는 AI와 같은 기능적 프로그래밍에 매우 적합합니다. 하이브리드 기능 / 제 국어는 이러한 경우에 매우 적합합니다.


9
The Next Mainstream Programming Languages ​​: The Game Developer 's Perspective 기사 는 pl, 특히 게임 개발을 위해 주장합니다. 여기서는 순수하게 기능적인 행동이 기본값이고 상태 변경이 유형을 통해 추적되어 버그를 피할 수 있습니다. 따라서 모든 사람이 기능적 패러다임이 본질적으로 게임 프로그래밍에 적합하지 않다고 믿지는 않습니다.
sepp2k

1
@ sepp2k, 링크 주셔서 감사합니다. 실제 게임을 만든 사람의 관점이 논쟁의 대상이되어 기쁘다.
Matt Olenik

3
@ sepp2k 잠깐만, 내가 뭔가를 놓쳤습니까? 프레젠테이션을보다 자세히 읽은 후 Sweeney는 대부분의 핵심 엔진이 순전히 기능적인 코드로 작성되고 대부분의 게임 로직이 반드시 작성 (또는 적어도 허용)하고 STM을 사용하여 동시성을 지원한다고 주장한 것 같습니다. . 이것은 나에게 매우 합리적 인 것 같습니다.
Matt Olenik

@Matt : 아니요, 맞습니다. 그는 게임 로직 부분에 가변 상태가 포함될 것이라고 말합니다. 그러나 이것이 유형을 통해 변이성을 추적하는 언어를 배제하는 것은 아닙니다 ( "musings"섹션에서 제안합니다). 물론 "유형을 통한 상태 추적"은 "기능적"과 같지 않으므로 이전 의견을 너무 낙관적으로 표현했을 수도 있습니다.
sepp2k

@ sepp2k 맞아, 무슨 말인지 알 겠어.
Matt Olenik

17

실시간 임베디드 프로그래밍은 부작용에 관한 것입니다. 디지털 및 아날로그 IO, 타이머, 직렬 및 병렬 포트와 상호 작용하여 흥미로운 모든 기능은 부작용이있는 함수를 호출하여 수행됩니다.


3
글쎄, 하드웨어 인터페이스를 의미한다면 C / C ++ 이외의 다른 것이 좋은 선택인지 의심합니다. 그러나 Erlang과 같은 언어 위에있는 계층에서는 특히 통신 시스템에서 가끔 사용됩니다. Erlang은 중요하고 내결함성이있는 임베디드 실시간 시스템을 위해 설계된 기능적 언어입니다.
Jonas

@Jonas : Erlang은 돌연변이를 최소화 할 수 있지만 IO에 크게 의존하여 메시지를 전달합니다. 물론 부작용입니다.
Jon Harrop

11

GUI 프로그래밍은 기능적 프로그래밍에 적합하지 않다고 주장합니다. GUI는 일반적으로 매우 상태가 양호하며 부작용없이 상태를 사용하여 모델링 / 관리하는 것이 훨씬 쉽습니다. GUI를위한 기능적 프로그래밍 언어를 사용하는 것이 가능 하지만, 아마도 좋은 생각은 아닙니다.

다른 답변에서 언급 한 바와 같이, 게임 상태를 추적하여 관리하는 것이 종종 쉽게, 당신은 동안 기능적인 언어로 게임을 쓰기는 (은 "상태"언어로 그렇게하는 것이 더 쉽고 효율적 즉, 객체 지향 언어).


-1 : 순도에 대해 이야기하고 일급 함수의 사용을 무시합니다. 예를 들어 GUI 코드의 콜백은 OOP 언어보다 FP 언어가 불완전한 경우 훨씬 쉽습니다.
Jon Harrop

4
@Jon Harrop : 일류 함수는 기능적 프로그래밍 언어에 고유하지 않습니다. 나는 여전히 FP 스타일이 GUI에 적합하지 않다고 주장한다.
mipadi

1
당신이 묻는 사람에 따라 다릅니다. 대부분의 함수형 프로그래머에게 일류 함수는 함수형 프로그래밍의 정의입니다.
Jon Harrop

@ Jon Harrop : 대부분의 기능 프로그래머는 기능 프로그래밍이 프로그램을 수학 함수의 구성 및 평가로 설명하는 방법이라고 말합니다. 일급 함수는이 패러다임의 중요한 부분이지만, 일급 함수만으로는 기능적 프로그래밍 언어 (또는 기능적 프로그램)가 아닙니다. 함수형 프로그래밍 패러다임은 상태 및 변경 가능한 데이터 구조의 사용을 최소화하기 위해 노력하며 FP 언어가 이러한 스타일을 권장하지도 않습니다. FP는 일류 함수와 같은 개별 기능과 마찬가지로 프로그래밍 스타일에 관한 것입니다.
mipadi

...이 패러다임이 GUI 프로그래밍에 특히 적합하다는 것을 알지 못합니다. 객체 지향 언어는 일반적으로 말하면 GUI에 더 적합합니다.
mipadi

5

데이터 중심 비즈니스 애플리케이션. 사용자 인터페이스와 간단한 데이터 작업에는 FP가 필요하지 않습니다.


2
그리고 다른 모든 데이터 /보기 응용 프로그램. 대부분의 게임은 상태와 변화에 관한 것이므로 기능적 스타일로 잘 번역되지는 않습니다.
Jon Purdy

18
정말? 나는 항상 FP가 이것에 특히 좋을 것이라고 생각했습니다 . 해당 앱이 데이터를 선택, 집계 및 투영하는 것의 99 %를 좋아하지 않습니까? 즉 기본적이다 filter, reduce하고 map. 일부 던져 sort, partition, groupBy. 결국, 이러한 응용 프로그램을 작성하기위한 가장 널리 사용되는 프로그래밍 언어는 엑셀,이다 기능적인 언어입니다.
Jörg W Mittag

3
간단한 데이터 작업이 가능한 데이터 중심 비즈니스 응용 프로그램 및 응용 프로그램은 FP에 매우 적합하다고 들릴 수 있으며 FP가 그러한 것들에 인기가 있다고 들었습니다. 예 : Wall Street의 Adventures fa 기능 프로그래머
Jonas

1
-1 : FP가 뛰어난 응용 프로그램을 나열했습니다.
Jon Harrop

2

함수형 프로그래밍 자체에 적합하지 않은 문제는 쉽게 무시할 수 없습니다.

함수형 프로그래밍에 사용되는 실제 언어와 기능에 따라 달라집니다.

실시간 임베디드 시스템에 대해 이미 언급 한 Erlang이 그 예입니다.

State-fullness는 또한 함수형 프로그래밍에 대한 좋은 기준이 아니며,이를 처리하기 위해 함수형 프로그래밍 언어로 구현 된 몇 가지 성공적인 방법이 있습니다.

기능 프로그래밍에 대한 부작용도 종종 언급됩니다. 완전히 독단적이지 않은 모든 프로그램에는 부작용이 있습니다. 따라서 모든 실제 FP 언어는이 문제를 처리 할 수있는 방법이 있습니다. 이는 세계 부작용을 얼마나 우아하게 캡슐화 하는가에 달려 있습니다.

전역 변수와 같은 임의의 부작용이 전혀 필요하지 않습니다.

그러나 문제를 보는 익숙한 방식을 왜곡하지 않기 때문에 함수형 프로그래밍에 더 쉽게 접근 할 수있는 문제 세트가 있습니다. 그러나 일단 기능적으로 생각하면 더 많은 문제 세트가 부작용이 적습니다.

C를 프로그래밍 할 때조차도 전역 변수와 같은 임의의 부작용을 가능한 한 줄이는 것이 좋습니다.


GUI 응용 프로그램과 같은 상태 저장 응용 프로그램은 실제로 기능적으로 수행하기가 어렵거나 권장 사항이 있습니까?
Jonas

어떤 종류의 프로세스 / 스레드 추상화가있는 경우 (예 : Erlang과 같이) 프로세스에서 상태를 전달할 수 있습니다.
Peer Stritzinger

3
GUI 애플리케이션은 일반적으로 이벤트 루프를 중심으로 구축됩니다. 기능적인 언어로 이벤트 루프를 작성할 수 있습니다. 더 복잡한 경우 백그라운드 처리를 위해 스레드 / 프로세스를 추가 할 수 있습니다. 그러나 어떤 종류의 프로세스 / 스레드 추상화가있는 경우 (예를 들어 Erlang과 같이) 프로세스에서 상태를 쉽게 전달할 수 있습니다. 계속하는 것도 도움이 될 수 있습니다. GUI를 다루기 위해 기능적인 방식으로 일을하는 데 익숙해 졌다고 생각합니다. 오늘날 GUI 프로그래밍이 어려운 이유 중 하나는 대부분의 툴킷이 기능적인 용도로 사용되지 않기 때문입니다.
Peer Stritzinger

1
@Jonas : Haskell에서는 IO 모나드, State 모나드 또는 조합을 사용합니다.
Larry Coleman

1
@Jonas : 유용한 정의에 따라 다릅니다. Wikibook 예제는 wxHaskell을 사용하고 Real World Haskell은 gtk2hs를 사용합니다. 내 Haskell 앱이 명령 줄 기반이므로 시도하지 않았습니다.
Larry Coleman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.