루비의 기능성 프로그래밍
2 페이지 1
소개
기능성 프로그래밍 (FP가)에 의해, "람다 계산법"으로, 발명 (또는 구조적 필수적 프로그래밍과 객체 지향 프로그래밍)의 전통에 대한 프로그래밍 패러다임의 대안입니다 알론소 교회는 그것이 알려졌다 훨씬 전, 30 년 만에 그 정확히 컴퓨터.
교회의 연구 프로그래밍 언어 LISP의 개발을위한 기반으로 재직하고 기본 및 생성 절대적으로 프로그래밍 컴퓨터를 확언으로 나서 거의 완전히 버려진 줄 파스칼, C, 오늘날과 같은 현대적인 C + + 및 Java.
람다의 미적분의 기본 아이디어는 컴퓨터 프로그램이 누구의 매개 변수로 많다 기능의 시리즈로, 대신 지침의 필수 세트 (그런 짓은 다음 이렇게 다음이 작업을 수행) 때문에 표현할 수있다는 것입니다 특징.
기능성 프로그램이 정상적으로 입력으로 등등 입력으로 다른 함수 소요 다른 함수 소요 함수로 구성되어 있습니다.
이것은 절대적으로 패러다임이나 객체로 작성된 기존의 프로그램은, 값이 프로그램의 "상태"를 나타내는 변수에 따라 행동 명령의 시리즈로 구성되어 있지만 기능적인 프로그래밍에서 변수의 개념이 존재하지 않는다는 것을 의미 (이 '도'에 대한 개념이없는)과 실행은 지속적인 기능에서 작동 기능의 개수에 위탁입니다.
기능적 언어의 관심은 특히 여러 가지 이유로, 학습의 어려움 (이것은 수학자가 아니면 보통 사람이 아니라 함수 객체보다 생각!) 그리고 찾는 어려움에 대해 시간이 지남에 따라 손실되었습니다 효율적인 컴파일러 또는 인터프리터.
루비 및 FP
기능적 프로그래밍은 매우 가치있는 결과를 가져다 때문에 오늘날, 이러한 관심은 그러나 잠에서되었습니다 : 그것은 런타임에 버그에 대한 정의를 리드함으로써 없습니다. 즉, 컴파일 시간 또는 첫 번째 실행에서 일의 성패 작동하지 않습니다. 방식으로 행동 수없는 예측 선험 (기능성 프로그램에서 사실 예외에 대한 개념이 없다).
따라서 태어나기 일부는 다음과 같은 기능적인 언어를 (더 많거나 적은 순수, 그리고 전통적 프로그래밍에 더 많거나 적은 지원) 번성하고 있습니다 : ML / Ocaml , 하스켈 , F # .
루비는 기능적인 언어가 아니라, 알고리즘, 더 많은 합성 더 강력하고 더 효과적인 수 있도록 우리를 도울 수있는 기능적인 프로그래밍 기술을 사용합니다. 읽기 즉, 일반적으로 쉽게 빼고.
각 및지도
어떤 방법으로 FP에서 지원하는 언어의 첫 번째 특징 특징은 기능성 반복자의 자신의 표준 라이브러리에하는 것입니다. 예를 들면 다음과 같습니다
$ 요소 = [1,2,3,4,5]는
$ Elementi.map {| elem | 박았 elem + 1}
함수 루비의 "지도"와 "각"은 적용된 FP보다 더 아무것도 없습니다!
사실 인수와 같은 다른 기능을 가지고 기능이 있습니다.
루비에서는 다음에 {} 또는 사이에 둘러싸인 코드 블록의 그 부분은 / 익명 함수가 여러 기능을 주제로 용도 지은 있습니다 끝나지 않도록.
이러한 기능은 FP 높은 주문 기능, 입력 등 다양한 기능으로 걸릴 즉, 함수에서 호출됩니다.
고전과 수학적 함수로 특정 "지도"행위에서 다음과 같이 읽을 수있는, 여섯 중 하나로 시리즈의 각 요소에 대해 함수를 실행 자연 번호 다음을 누르십시오.
그 '지도'또는 '동료'컬렉션의 각 요소 (루비에서 배열시키는 것이) 블록에 정의된 특정 기능.
똑같은로 자연스럽게 일어날 것이다 :
Elementi.each $ {...}
폐쇄 : PROC 및 람다
폐쇄가 높은 순서대로 함수의 그것과 유사한 개념입니다 실질적으로 기능 (예 : 다른 변수를 전역 변수 또는 함수 같은)의 것과 다른 맥락에서 살고있는 변수에 따라 행동하는 함수를 정의할 수있는 기능.
루비에서 나는 키워드 Proc.new 또는 람다로 정의할 수 익명 함수를 사용하여 클로저를 쓸 수 있습니다.
자, 예를 들어 보자 :
데프의 증식 (곱셈기)
{| N | N * 배율} 람다를 반환
끝
per3 = 곱셈 (3)
per3.call두고 (3) # => 9
per3.call (per8.call (2)) # => 48두고
이 예제에서는 정확히 자명한 나는 기능 "곱셈"가 아니라.
이 기능이 뭔데 이렇게 이상해?
여기 간단히 말해서 나는 어떤 변수를 사용하지 않습니다!
실제로 인수는 가변 배율 아닙니다 그것은 단순히 상수에 대한, 또는 다른 함수에 대한 자리 표시 자입니다.
그러나, 전통적인 프로그래밍에, 나는 쓸 것입니다 :
최종 곱셈 (A, B)
* B를 반환
끝
곱셈을 박았 (3.3)
볼 수 있듯이, 그러나 폐쇄를 사용하여 제가 모든 multiplications "X3"의 동작을 정의합니다 제가 per3 전화 "연산자"를 부릅니다.
그런 다음이 연산자 3 번 부릅니다.
난 그것을 재귀적으로 호출할 수 있습니다!
아니면 다른 함수에서 대신 상수, 그것을 부릅니다.
그래서 두 숫자의 곱셈을 제한함으로써 - - 전통적인 프로그래밍 그러나, 내가 선험적에게 거래에 관련된 변수의 개수를 정의하도록 강요하고 있으며, 가장 중요한, 내가 두 변수가 그것에 메모리를 할당, 상태 개념을 입력 곱한되는 값을 포함합니다.






