답변:
물론 당신이 수 할 C.에서 이론 프로그래밍 기능을, 당신은 또한 수 배우고 C에서 함수형 프로그래밍 원칙을하지만, 언어는 쉽게 그것을하지 않습니다.
나는 OOP에 적어도 약간의 배경이 있다고 가정합니다. 그렇게하면 다형성, 게터 / 세터, 가시성 규칙 등을 포함하여 C에서 OOP를 수행 할 수 있지만 OOP와 C를 모두 알고 있어야합니다. 그것을 꺼내기 위해. FP와 거의 동일합니다.
당신이 해야한다 (그들을 열심히 배울 수 있습니다 구문이 아니다 그들 중 대부분은 놀라 울 정도로 간단한 문법 규칙을 가지고), 그리고 일을해야하는 것은 함수형 프로그래밍 언어를 배우는 첫 번째 후 새로 획득 한 지혜가 당신이 C를 작성하는 방법에 영향을 미칠 수 있습니다
요청에 따라 FP에서 배우고 C, C ++ 또는 Java에 적용 할 수있는 몇 가지 사항 :
C는 일부 기능적 개념을 제공하기 위해 해킹 될 수 있습니다.
이 StackOverflow 질문 은 더 많은 것을 알려줄 것입니다. 그러나 C, 해킹 및 컴파일러 확장에서 기능 프로그래밍 (또는 많은 부분 집합)을 수행하는 것이 가능하지만 개념을 배우는 가장 좋은 방법은 아닙니다.
실제로 함수형 프로그래밍을 배우는 가장 좋은 방법은 Lisp 및 그 방언 ( Clojure , Scheme ), Erlang 및 Haskell 과 같은 중요한 함수형 프로그래밍 언어 중 하나입니다 . 이들 중 하나는 기능적 프로그래밍 마인드 내에서 작동하는 완벽한 도구입니다. .Net 배경을 가지고 있다면 F # 도 좋은 후보이지만, 기능적인 프로그래밍 언어가 아닌 다중 패러다임 언어입니다.
tdammers가 주석에 언급 한 것처럼 :
실제로 LISP, clojure 및 scheme도 다중 패러다임입니다. Haskell은 순수하고 기본 게으르지 만 모나드 컨텍스트에서 명령형 프로그래밍을 허용하며 동시 처리를 광범위하게 지원합니다. 이 모든 것들은 OOP 세계에서 수집 된 지혜의 많은 부분을 캡슐화, 상속, 단일 책임, 구성 등 구현하는 메커니즘을 가지고 있습니다. 언어가 다른 패러다임을 허용하는지 여부는 그리 중요하지 않습니다. 어떤 패러다임이 언어의 출발점을 형성하는지에 관한 것입니다.
그들은 다른 패러다임을 통해 함수형 프로그래밍을 장려하기 때문에 내가 아는 리스프와 방언과 얼랑 F 번호보다 더 나은 후보, 어떤 tdammers 아름답게하는 것은 같은 상태 언어의 시작 지점 . F #은 함수형 프로그래밍을 포함하지만 다른 지원되는 패러다임, 명령형 및 oo 프로그래밍에 대해서는 권장하지 않습니다.
C에서 함수형 프로그래밍의 모든 측면을 배울 수는 없지만 모든 필수 언어로 함수형 프로그래밍을 시작할 수 있습니다. 이러한 시작 비트는 "프로그래밍하는 동안 순수한 것을 유지하는 방법"입니다. 그리고 C도 가능합니다. 자세한 내용은이 블로그 게시물을 확인하십시오.
http://www.johndcook.com/blog/2011/07/24/get-started-functional-programming/
함수형 프로그래밍은 클로저 및 해당 응용 프로그램에 관한 것입니다. 누군가가 C에 대한 하강 폐쇄 라이브러리를 보여줄 수 없다면, C를 사용하여 함수형 프로그래밍을 배우는 것을 잊지 마십시오.
함수형 프로그래밍의 기본 개념은 대략적으로 말하면 변수 바인딩과 함께 함수를 캡처하는 클로저 개념입니다 . 클로저를 광범위하게 사용하는 것 외에도, 재귀 함수 및 불변 값 (둘 다 함께 사용)과 같은 기능 프로그래밍에 몇 가지 다른 특성이 있습니다. 이러한 특성은 다른 어떤 것보다 문화적 문제이며, 사실상 어떤 언어로든 사용하는 데 기술적 장애가 없습니다. 이것이 제가 대답에서 폐쇄에 초점을 두는 이유입니다. 모든 언어가 쉽게 폐쇄를 만들 수있는 것은 아닙니다.
클로저의 일반적인 사용은 개인 정보 보호 메커니즘의 구현입니다. 예를 들어 Javascript 코드 – 예제에서 Javascript는 소위 "C-like syntax"가있는 기능적 언어이므로 C를 잘 알고 있다고 제안합니다.
create_counter = function()
{
var x = 0;
var counter = function()
{
++x;
return x;
};
return counter;
}
그런 다음
a = create_counter();
b = create_counter();
우리는 두 개의 함수 a
와 b
분리 된 컬렉션을 세고 있습니다. 예제의 요점은 변수 x
가 클로저를 정의하는 counter
클로저에 의해 캡처되고 매번 새 counter
클로저 x is instantiated by the function, it gets its fresh own idea of what
가있을 때입니다.
클로저의 또 다른 일반적인 용도는 기능의 부분적 적용의 정의입니다. syslog
기능 구현 과 유사한보고 기능이 있다고 가정
var log = function(priority, message) {
…
};
여기서 인수 priority
및 message
문자열은 문자열이어야하며 첫 번째는 "debug"
, "info"
등 중 하나입니다 . 다음과 같이 로그 팩토리를 정의 할 수 있습니다.
var logWithPriority = function(priority) {
return function(message) {
log(priority, message);
};
};
로그 기능의 특수 버전을 정의하는 데 사용하십시오.
var debug = logWithPriority("debug");
var info = logWithPriority("info");
…
이것은 오류가 발생하기 쉬운 for
루프 를 작성하는 대신 매우 유용 합니다.
for(i = 0; i < journal.length; ++i) {
log("info", journal[i]);
}
우리는 더 깨끗하고 짧고 훨씬 더 간단하게 작성할 수 있습니다 (아니요 i
, 훨씬 좋습니다).
journal.forEach(logWithPriority("info"));
폐쇄의 세 번째 중요한 응용 분야는 지연 평가의 구현입니다. 특수 언어 지원이 더 나은 구현을 제공 할 수 있습니다.
게으른 함수는 직선 계산을 수행하는 대신 질문을 수행하기 위해 호출 될 수있는 (또는 게으른 용어로 "강제") 클로저를 반환합니다. 이 작업의 동기는 계산 준비와 계산 수행을 분리한다는 것입니다. 실제 예는 정규식 컴파일입니다. 시작시 프로그램이 많은 정규식을 컴파일하는 경우 시작하는 데 많은 시간이 필요합니다. 대신 정규 표현식을 느리게 컴파일하고 필요할 때 강제로 실행하면 프로그램을 빠르게 시작할 수 있습니다. 물론, 정규식은 여기에서 상당한 초기화 시간을 요구하는 임의의 구조로 대체 될 수있다.
다음은 클로저로 지연 평가를 구현하는 방법입니다. 배열 에서 max 를 반환하는 arrayMax 함수 의 고전적인 구현을 고려하십시오 .
function arrayMax(array) {
return array.reduce(function(a, b) {
return Math.min(a, b);
};
}
게으른 변형은 다음과 같습니다.
function arrayMax(array) {
var memo = null;
function actuallyCompute() {
if(memo === null) {
memo = array.reduce(function(a, b) {
return Math.min(a, b);
});
}
return memo;
}
return actuallyCompute;
}
반환 된 값은 값을 계산하거나 이미 계산 된 경우 다시 검색하는 데 사용할 수있는 클로저입니다.
이 세 가지 예를 통해 클로저와 해당 응용 프로그램이 함수형 프로그래밍의 핵심 임을 확신해야합니다 .
기능적 프로그래밍 학습이란 클로저로 프로그래밍하는 방법을 학습하는 것을 의미합니다. 결과적으로 함수형 프로그래밍을 공부할 언어를 찾을 때 클로저를 쉽게 조작 할 수있는 언어, 특히 함수를 부분적으로 적용 할 수있는 언어를 고려해야합니다. 반대로 클로저를 쉽게 조작 할 수없는 언어는 선택이 좋지 않습니다.
사용하는 도구가 학습에 많은 영향을 준다고 생각합니다. 사용하는 프로그래밍 언어가 사용할 수단을 제공하지 않는 프로그래밍 개념을 배우는 것은 거의 불가능합니다. 물론, 항상 몇 가지를 배울 수 있지만 제대로 배울 수는 없습니다.
그러나 Martinho가 그의 의견에서 말했듯이 함수형 프로그래밍을 배울 수 있더라도 훨씬 쉬운 언어가 있기 때문에 그렇게 시도 해서는 안되기 때문에 그것은 학문적입니다 .
C에서는 기능 프로그래밍을 배우지 말고 엄격한 기능 언어 (Haskell, Caml, Erlang 등)로 학습해야합니다.
당신이 기능에 익숙하지 않다면, 당신은 실제로 비 기능적 언어로 그것을 얻지 못할 것입니다. 아마도 당신은 함수형 프로그래밍이라고 생각하는 것을하고 잘못된 것을 배우도록 스스로 훈련 할 것입니다. 그리고 처음에는 올바른 방법을 배우는 것보다 올바른 방법으로«재 학습»하는 것이 항상 어렵습니다.
어쨌든, C에서 기능을 수행하는 것은 이미 기능을 알고있는 사람에게 좋은 운동이라고 생각합니다. 그 사람은 컴퓨터 뒤에서 무슨 일이 일어나고 있는지-컴퓨터가 실제로하고있는 일을 배우기 때문입니다.