어떤 상황에서 C ++, C # 또는 Java와 같은보다 장황한 객체 지향 언어보다 함수형 프로그래밍 언어를 사용하도록 선택해야합니까?
나는 함수형 프로그래밍이 무엇인지 이해하고, 내가 정말로 이해하지 못하는 것은 어떤 유형의 문제에 대한 완벽한 해결책인가?
어떤 상황에서 C ++, C # 또는 Java와 같은보다 장황한 객체 지향 언어보다 함수형 프로그래밍 언어를 사용하도록 선택해야합니까?
나는 함수형 프로그래밍이 무엇인지 이해하고, 내가 정말로 이해하지 못하는 것은 어떤 유형의 문제에 대한 완벽한 해결책인가?
답변:
제 생각에 기능적 언어는 주로 게임 AI와 수학적 계산이라는 두 가지에 유용합니다. 좋은 목록 조작 (적어도 Lisp 및 Scheme에서는)과 구문으로 인해 수학적 계산에 적합하기 때문에 게임 AI에 적합합니다. Scheme, Lisp 및 Haskell에는 수학적 계산을 쉽게 읽을 수있는 구문이 있습니다. 마지막으로 추가해야 할 것은 기능적 언어가 정말 재미있는 언어라는 것입니다. 나의 Scheme 과정은 내가 가장 재미있게했던 과정 중 하나였습니다.
나는 이것에 대해 약간의 조사를 해왔고 기능적 언어를 사용하는 이유 목록에 CONCURRENCY를 추가 할 것이라고 생각했습니다. 가까운 장래에 프로세서 속도는 동일한 CPU 기술을 사용하여 증가 할 수 없을 것입니다. 건축의 물리학은 그것을 허용하지 않을 것입니다.
그래서 동시 처리가 시작됩니다.
불행히도 대부분의 OOP 언어는 데이터 간의 상호 의존성 때문에 한 번에 여러 프로세서를 활용할 수 없습니다.
순수 함수형 프로그래밍 언어에서 컴퓨터는 두 가지 (또는 그 이상) 함수를 한 번에 실행할 수 있습니다. 이러한 함수는 외부 상태 정보를 변경하지 않기 때문입니다.
다음은 여러분이 즐길 수있는 함수형 프로그래밍에 대한 훌륭한 기사 입니다.
내 친구는 그의 대학 교수 중 한 명이 다음과 같이 말한 것으로 인용했습니다.
상단에는 데이터 유형이 있고 왼쪽에는 해당 데이터 유형에 대한 작업이 포함 된 그리드를 그립니다. 그리드를 수직으로 자르면 OO를하는 것입니다. 그리드를 수평으로 자르면 FP를 수행하는 것입니다.
내 대답은 FP가 OO만큼 광범위한 응용 프로그램을 사용하여 프로그래밍에 대한 완전히 실행 가능한 접근 방식이라는 것입니다. 프로그래밍 언어 선택 토론과 마찬가지로 더 중요한 질문은 다음과 같습니다.
첫 번째 질문에 대해 학습 가치를 위해이 작업을 수행하는 경우 다양한 지원 자료 (책, 기사, 활발한 커뮤니티 등) 때문에 Haskell을 살펴 보는 것이 좋습니다 .
두 번째 질문과 관련하여 Haskell은 다양한 라이브러리를 보유하고 있지만 (일부는 다른 것보다 성숙했지만) Scala (JVM에서 실행되는 하이브리드 OO 기능 언어)는 점차적으로 기능적 스타일로 전환 할 수있는 장점이 있습니다. , 사용 가능한 모든 범위의 Java 액세스 가능 라이브러리가 있습니다.
실제로 PP에서 할 수있는 모든 작업은 FP에서 수행 할 수 있으며 그 반대도 마찬가지입니다. 이는 문제에 대한 또 다른 관점과 문제를 해결하는 다른 방법으로 무언가를 코딩하는 또 다른 방법 일뿐입니다.
그러나 FP를 사용하는 사람이 많지 않기 때문에 문제는 좋은 라이브러리의 부족, 이식성 / 유지 보수성 (관리자가 Scheme보다 C ++로 작성된 것을 이해할 수있는 더 나은 기회를 가지기 때문에), 문서 및 커뮤니티의 부족에 관한 것입니다. 일부 문서가 있지만 C ++, C # 또는 Java와 비교하면 내가 의미하는 바를 이해할 수 있습니다.
그러나 정말로 FP를하고 싶다면 C ++과 C #에서도이 스타일을 사용할 수 있습니다. 물론 표준 라이브러리를 사용하면 100 % FP가 아닙니다. 불행히도 나는 C #이 함수형 프로그래밍과 함께 사용되도록 최적화되어 있지 않다고 생각하며 아마도 많은 성능 문제를 일으킬 것입니다.
이것은 내가 FP에 대해 생각하는 더 주관적인 게시물입니다. 엄격한 선언이 아닙니다.
기능적 언어는 많은 상황에서 좋습니다. 특정 기능 언어의 라이브러리에 따라 다릅니다.
"객체 지향 프로그래밍 언어를 언제 사용해야합니까?"라는 질문에 어떻게 대답 하시겠습니까?
이것은 매우 주관적인 질문이지만 기능적 언어가 도메인 특정 언어 를 구문 분석하는 데 많이 사용된다는 점을 덧붙이고 싶습니다 . 기능적 특성은 구문 분석 문법에 적합합니다.
내가 본 바에 따르면 기능성보다는 맛의 문제입니다 (말장난 의도 없음). 특정 작업에서 본질적으로 더 좋거나 나쁘게 만드는 언어 스타일에 대해서는 실제로 아무것도 없습니다.
일반적으로 문제에 대한 해결책을 표현하기 가장 쉬운 언어를 사용하십시오. 함수형 프로그래밍의 경우 문제에 대한 솔루션이 함수 측면에서 쉽게 표현 되므로 이름이됩니다. 일반적으로 수학적 연산, 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와 같은 클로저 사용입니다.