Listen to this article

기능 프로그래밍

Functional programming

컴퓨터 과학에서 기능 프로그래밍기능적용하고 구성하여 프로그램을 구성하는 프로그래밍 패러다임이다.프로그램의 실행 상태를 업데이트하는 명령문 순서가 아니라 함수 정의가 다른 값에 을 매핑하는 표현식트리선언적 프로그래밍 패러다임이다.

기능 프로그래밍에서 기능은 1급 시민으로 취급되는데, 이는 다른 데이터 유형이 할 수 있는 것처럼 이름(로컬 식별자 포함)에 묶일 수 있고, 주장으로 전달되며, 다른 기능에서 반환될 수 있다는 것을 의미한다.이를 통해 프로그램을 선언적이고 구성 가능한 스타일로 작성할 수 있으며, 작은 기능들이 모듈식으로 결합된다.

기능 프로그래밍은 순수 기능 프로그래밍과 동의어로 취급되기도 하고, 모든 기능을 결정론적 수학적 함수로 취급하는 기능 프로그래밍의 하위 집합체 또는 순수 함수로 취급되기도 한다.어떤 주어진 주장으로 순수함수를 호출하면 항상 같은 결과를 반환하게 되고, 어떤 변이성 상태나 다른 부작용에 영향을 받을 수 없다.이것은 (프로그램의 상태를 수정하거나 사용자로부터 입력을 받는 등) 부작용을 일으킬 수 있는 명령적 프로그래밍에서 공통적으로 나타나는 불순한 절차와는 대조적이다.순기능 프로그래밍을 지지하는 사람들은 부작용을 제한함으로써 프로그램은 버그 수를 줄이고 디버깅과 테스트가 용이하며 공식적인 검증에 더 적합할 수 있다고 주장한다.[1][2]

기능 프로그래밍은 기능만을 바탕으로 한 계산의 형식 체계인 람다 미적분학에서 발전하여 학계에 뿌리를 두고 있다.기능 프로그래밍은 역사적으로 필수 프로그래밍보다 인기가 적었지만, 오늘날 산업과 교육에서 공통 리스프, 체계,[3][4][5][6] 클루주어, 울프램 언어,[7][8] 라켓,[9] 얼랑,[10][11][12] 엘리시르,[13] OCaml,[14][15] 하스켈,[16][17] F#[18][19] 등 많은 기능 언어들이 사용되고 있다.함수형 프로그래밍도 가진 자바 스크립트를 Web,[20]R에서 statistics,[21][22]J, K와 Q재무 분석에서, 그리고 XQuery/XSLT 같은 SQL과 Lex/Yacc 기능적 프로그래밍의 뮤를 허용하지 않은 것으로 일부 요소를 사용한다 XML.[23][24]Domain-specific 선언적 언어에 등 특정 영역에서 성공을 발견했다 일부 언어들, 핵심이다.표 값을 본다.[25]또한, 많은 다른 프로그래밍 언어는 기능적 형식의 프로그래밍을 지원하거나 기능적 프로그래밍의 특징을 구현해 왔으며, C++11, C#,[26] Kotlin,[27] Perl,[28] PHP,[29] Python,[30] Go,[31] 러스트,[32] 라쿠, [33]스칼라, [34]자바(Java 8 이후) 이 있다.[35]

역사

알론조교회가 1930년대에 개발한 람다 미적분학함수 응용을 통해 축적한 연산 형식 시스템이다.1937년 앨런 튜링은 람다 미적분과 튜링 기계가 동등한 연산 모델이라는 것을 [36]증명하여 람다 미적분이 튜링 완료임을 보여주었다.람다 미적분은 모든 기능 프로그래밍 언어의 기초를 이룬다.등가 이론적 공식인 결합 논리는 1920년대와 1930년대에 모세 쇤핀켈하스켈 커리에 의해 개발되었다.[37]

교회는 후에 더 약한 계통인 단순형 람다 미적분을 개발했는데, 이것은 모든 용어에 유형을 할당함으로써 람다 미적분을 확장시켰다.[38]이것은 정적인 형식의 기능 프로그래밍의 기초를 형성한다.

최초의 고급 기능 프로그래밍 언어인 LISP는 1950년대 후반 매사추세츠공과대학(MIT)에 재직하던 존 매카시에 의해 IBM 700/7000 시리즈 과학 컴퓨터를 위해 개발되었다.[39]LISP 기능은 Church의 람다 표기법을 사용하여 정의되었으며, 재귀 함수를 허용하는 라벨 구성으로 확장되었다.[40]Lisp는 초기 Lisps는 다중 패러다임 언어였지만 기능 프로그래밍의 많은 패러다임 특징을 처음 도입했고, 새로운 패러다임이 진화함에 따라 수많은 프로그래밍 스타일에 대한 지원을 통합했다.SchemeClojure와 같은 후기 방언과 DylanJulia와 같은 오프슈트들은 Lisp를 깨끗하게 기능하는 핵심을 중심으로 단순화하고 합리화하려고 노력했고, Common Lisp은 그것이 대체한 수많은 오래된 방언들의 패러다임적 특징을 보존하고 업데이트하기 위해 고안되었다.[41]

IPL(Information Processing Language, 1956년)은 때때로 최초의 컴퓨터 기반 기능 프로그래밍 언어로 언급된다.[42]기호 목록을 조작하기 위한 조립식 언어다.그것은 하나의 함수를 인수로 받아들이는 함수에 해당하는 생성기 개념을 가지고 있으며, 조립 수준 언어인 만큼 코드가 데이터일 수 있으므로 IPL은 고차 함수를 가지는 것으로 간주할 수 있다.그러나 그것은 돌연변이 목록 구조와 유사한 명령적 특징에 크게 의존한다.

케네스 E. 아이버슨은 1962년 저서 A 프로그래밍 언어(A Programming Language)에서 설명한 1960년대 초 APL을 개발했다. ISBN9780471430148).APL은 존 백커스FP에 가장 큰 영향을 미쳤다.1990년대 초에 아이버슨과 로저 후이는 J를 만들었다.1990년대 중반 아이버슨과 함께 일한 경험이 있는 아서 휘트니후예 Q와 함께 금융업에서 상업적으로 사용되는 K를 만들었다.

존 백커스는 1977년 튜링상 강연 '프로그래밍이 폰 노이만 스타일에서 해방될 수 있을까'에서 FP를 선보였다.기능적 스타일과 프로그램 대수"라고 말했다.[43]그는 기능적 프로그램이 "프로그램의 상징"을 허용하는 "결합 형태"를 통해 계층적 방식으로 구축되는 것으로 정의한다. 현대어로 기능적 프로그램은 구성성의 원리를 따른다는 것을 의미한다.[citation needed]백커스의 논문은 현재 기능 프로그래밍과 관련된 람다-미적분학 스타일보다는 기능 수준 프로그래밍을 강조했지만 기능 프로그래밍에 대한 연구를 대중화했다.

1973년 언어 ML에든버러 대학로빈 밀너에 의해 만들어졌고, 데이비드 터너세인트 앤드류스 대학에서 SASL 언어를 개발했다.또한 1970년대에 에든버러에서 버스타와 달링턴은 기능 언어인 NPL을 개발했다.[44] NPL은 클레인 리커시온 방정식을 기반으로 하며 프로그램 변환 작업에 처음 도입되었다.[45]그 후 버스타올, 맥퀸, 산넬라는 ML의 다형체 검사법을 통합하여 호프라는 언어를 제작했다.[46] Hope)를 만들었다.ML은 결국 여러 방언으로 발전했고, 그 중 가장 흔한 방언은 OCamlStandard ML이다.

1970년대에 가이 스틸과 제럴드 제이 서스맨람다 논문과 1985년 교과서 컴퓨터 프로그램구조와 해석에 설명된 대로 "계획"을 개발했다.체계는 어휘 범위 지정을 사용하고 기능 프로그래밍을 장려하는 기능인 테일-콜 최적화를 요구하는 혀의 첫 번째 방언이었다.

1980년대에 페르 마틴 뢰프직관론적 유형 이론(건설적 유형 이론이라고도 함)을 개발하였는데, 이 이론은 기능적 프로그램을 종속적 유형으로 표현된 건설적 증빙과 연관시켰다.이는 상호 작용 정리에 대한 새로운 접근방식으로 이어져 후속 기능 프로그래밍 언어의 개발에 영향을 끼쳤다.[citation needed]

데이비드 터너가 개발한 게으른 기능어 미란다는 1985년에 처음 등장하여 하스켈에게 강한 영향을 끼쳤다.미란다가 독점적인 관계로, Haskell은 1987년에 기능 프로그래밍 연구를 위한 공개 표준을 형성하기 위한 합의로 시작했다; 구현 릴리스는 1990년 이후로 계속 진행되어 왔다.

보다 최근에는 CSG 지오메트리 프레임워크에 구축된 OpenSCAD 언어에 대한 파라메트릭 CAD와 같은 NIC에서 사용법을 발견했지만 (모든 값은 상수로 취급됨) 값 재할당을 제한하는 것은 기능 프로그래밍을 개념으로 잘 모르는 사용자들 사이에서 혼란을 야기했다.[47]

기능 프로그래밍은 상업적 환경에서 계속 사용된다.[48][49][50]

개념

많은 개념과 패러다임은 기능적 프로그래밍에 특수하며 일반적으로 명령적 프로그래밍에는 이질적인 개념과 패러다임이 있다(객체 지향 프로그래밍 포함).그러나 프로그래밍 언어는 종종 몇 가지 프로그래밍 패러다임에 부합하기 때문에, "가장 필수적인" 언어를 사용하는 프로그래머들은 이러한 개념들 중 일부를 이용했을 수 있다.[51]

일급 및 고차 기능

고차 함수는 다른 함수를 인수로 받아들이거나 결과로서 반환할 수 있는 함수를 말한다.미적분학에서 고차 함수의 예는 함수 dx파생 모델을 반환하는 차등 연산자 / d/이다

고차함수는 고차함수와 1차함수 모두 다른 함수의 주장과 결과로서 기능을 허용한다는 점에서 1차함수와 밀접한 관련이 있다.둘의 구별은 미묘하다."순서"는 다른 기능에서 동작하는 함수의 수학적 개념을 기술하는 반면, "1종"은 그 사용에 제한이 없는 프로그래밍 언어 실체를 위한 컴퓨터 과학 용어다(수치 같은 다른 1종 실체가 주장으로 포함시킬 수 있는 프로그램 어디든 나타날 수 있다).다른 기능 및 반환 값과 같이).

고차 함수는 각각의 응용 프로그램이 다음 인수를 수용하는 새로운 함수를 반환하면서 한 번에 하나씩 그 인수에 함수를 적용하는 기술인 부분적 응용이나 큐레이팅을 가능하게 한다.이를 통해 프로그래머가 간결하게 표현할 수 있는데, 예를 들어 자연수 1에 부분적으로 적용되는 추가 연산자로서 후계자 기능을 할 수 있다.

순수함수

순수한 함수(또는 표현)는 부작용(메모리 또는 I/O)이 없다.즉, 순기능에는 몇 가지 유용한 특성이 있으며, 그 중 다수는 코드를 최적화하는 데 사용할 수 있다.

  • 순수표현 결과를 사용하지 않으면 다른표현에 영향을 주지 않고 제거할 수 있다.
  • 만일 순수함수가 부작용 없는 주장으로 호출된다면, 그 결과는 그 인수 목록(참조 투명성 또는 공전성이라고도 함), 즉, 동일한 주장으로 순수함수를 다시 호출하면 동일한 결과가 반환된다.(이것은 메모화 등의 캐싱 최적화를 활성화할 수 있다)
  • 두 순수한 표현식 사이에 데이터 의존성이 없다면 그 순서를 뒤바꿀 수도 있고, 동시에 수행될 수도 있고 서로 간섭할 수도 없다(다른 말로 표현하면 어떤 순수한 표현에 대한 평가는 나사산-안전하다).
  • 만약 전체 언어가 부작용을 허용하지 않는다면, 어떤 평가 전략도 사용될 수 있다; 이것은 컴파일러가 프로그램의 표현에 대한 평가를 재정렬하거나 결합할 수 있는 자유를 준다(예를 들어 삼림 벌채 사용).

명령적 프로그래밍 언어에 대한 대부분의 컴파일러는 순수 함수를 감지하고 순수 함수 호출에 대한 공통-하위 표현 제거를 수행하지만, 일반적으로 이 정보를 노출하지 않는 사전 컴파일 라이브러리에 대해서는 항상 이 작업을 수행할 수 없으며, 따라서 이러한 외부 함수와 관련된 최적화를 방지할 수 없다.gcc와 같은 일부 컴파일러는 프로그래머가 외부 기능을 순수한 것으로 명시적으로 표시하도록 키워드를 추가하여 그러한 최적화를 가능하게 한다.포트란 95도 기능을 순수하게 지정한다.[52]C++11이 추가됨constexpr비슷한 의미론의 키워드

재귀

기능 언어의 반복(루핑)은 보통 반복을 통해 이루어진다.재귀 함수는 자신을 호출하여 작업이 베이스 케이스에 도달할 때까지 반복되도록 한다.일반적으로 재귀는 스택을 유지해야 하는데, 이는 재귀 깊이까지 선형적으로 공간을 소모한다.이것은 반복을 명령적인 루프 대신에 사용하기에 엄청나게 비싸게 만들 수 있다.그러나 꼬리 재귀라고 알려진 특별한 형태의 재귀는 컴파일러에 의해 인식되고 명령어로 반복을 구현하는 데 사용된 것과 동일한 코드로 최적화될 수 있다.꼬리 반복 최적화는 컴파일 중 프로그램을 연속 패스 스타일로 변환하여 구현될 수 있다.

Scheme 언어 표준은 적절한 꼬리 재귀(tail recurration)를 지원하기 위한 구현을 요구한다. 즉, 제한 없는 수의 활성 꼬리 통화가 허용되어야 한다는 것을 의미한다.[53][54]적절한 꼬리 재발은 단순한 최적화가 아니다; 그것은 반복을 사용하여 루프를 표현할 수 있고 그렇게 하는 것이 공간적으로 안전하다는 것을 사용자에게 보장하는 언어 기능이다.[55]더구나 이름과는 달리 꼬리 재귀만이 아니라 모든 꼬리 부름을 차지한다.적절한 꼬리의 재귀는 보통 코드를 명령 루프로 전환하여 구현되지만, 구현은 다른 방법으로 구현될 수 있다.예를 들어, CHICK은 의도적으로 스택을 유지하며 스택이 오버플로되도록 한다.그러나 이 경우 쓰레기 수거기가 다시 공간을 차지하게 [56]돼 꼬리 재귀가 루프로 바뀌지 않아도 한없이 많은 활성 꼬리 통화가 가능하다.

일반적인 재귀 패턴은 고차 함수를 사용하여 추상화할 수 있으며, 가장 분명한 예로는 카타모르피즘아나모르피즘(또는 "폴드"와 "언폴드")이 있다.그러한 재귀 계획은 명령어에서의 루프와 같은 내장 제어 구조와 유사한 역할을 한다.

대부분의 범용 기능 프로그래밍 언어는 제한되지 않은 재귀가 허용되며 튜링완료되어 있어 중단되는 문제미해결 상태로 만들고 등가 추론의 불건전성을 야기할 수 있으며, 일반적으로 언어의 유형 시스템에 의해 표현되는 논리에 비일관성을 도입할 것을 요구한다.Coq와 같은 일부 특수 목적 언어는 근거가 충분한 재귀만 허용하며 강하게 정상화하고 있다(비정규 연산은 codata라고 하는 값의 무한 스트림으로만 표현할 수 있다).그 결과 이들 언어는 튜링 완성이 되지 못하고 그 안에서 특정 기능을 표현하는 것은 불가능하지만, 여전히 무제한 재귀에 의해 유입되는 문제를 피하면서 폭넓은 종류의 흥미로운 연산을 표현할 수 있다.기능 프로그래밍은 몇 가지 다른 제약조건과 함께 근거가 충분한 재귀로 제한되어 총기능 프로그래밍은 총기능 프로그래밍이라고 한다.[57]

엄격한 평가 대 엄격한 평가

함수 언어는 표현식이 평가될 때 함수 인수가 어떻게 처리되는지를 나타내는 개념인 엄격한(eager) 평가를 사용하는지 또는 엄격하지 않은(lazy) 평가를 사용하는지 여부에 따라 분류할 수 있다.기술적 차이는 실패 또는 상이한 계산을 포함하는 표현식의 변절적 의미론에 있다.엄격한 평가 하에서, 불합격된 하위 용어를 포함하는 용어의 평가는 실패한다.예를 들어 다음과 같은 표현식을 참조하십시오.

인쇄 길이([2+1, 3*2, 1/0, 5-4])

목록의 세 번째 요소에서 0으로 나누기 때문에 엄격한 평가 하에서 실패한다.게으른 평가에서 길이 함수는 4 값(즉, 목록의 항목 수)을 반환하는데, 이는 평가 내용이 목록을 구성하는 용어를 평가하려고 하지 않기 때문이다.요컨대, 엄격한 평가는 항상 함수를 호출하기 전에 함수 인수를 완전히 평가한다.게으른 평가는 함수 호출 자체를 평가하기 위해 함수 인수의 값이 요구되지 않는 한 함수 인수를 평가하지 않는다.

기능 언어의 게으른 평가를 위한 일반적인 실행 전략은 그래프 감소다.[58]게으른 평가는 미란다, 클린, 하스켈을 포함한 몇몇 순수한 기능 언어에서 기본적으로 사용된다.

휴즈 1984는 데이터 스트림의 생산자와 소비자의 독립적 구현을 완화함으로써, 우려의 분리를 통한 프로그램 모듈화를 개선하는 메커니즘으로서 게으른 평가를 주장한다.[2]Launchbury 1993은 특히 프로그램의 스토리지 요구사항을 분석할 때 게으른 평가가 도입하는 몇 가지 어려움에 대해 설명하고, 그러한 분석을 지원하기 위한 운영 의미론을 제안한다.[59]하퍼 2009는 언어의 유형 시스템을 사용하여 동일 언어로 엄격한 평가와 게으른 평가를 모두 포함하는 것을 제안한다.[60]

유형 시스템

특히 1970년대 힌들리-밀너형 추론이 발달한 이후 기능 프로그래밍 언어는 편찬 시 모든 유효 프로그램을 수용하는 비형식 람다 미적분과는 반대로 편찬 시 모든 유효 프로그램을 거부하고 거짓 양성 오류를 무릅쓰는 유형화된 람다 미적분학을 사용하는 경향이 있었다.정보가 유효한 프로그램을 거부하지 않을 정도로 충분한 경우, 실행 시 모든 유효하지 않은 프로그램을 거부하기 때문에(: Scheme) Lisp 및 그 변형에서 사용되는 부정적인 오류.대수 데이터 유형의 사용은 복잡한 데이터 구조를 조작하는 것을 편리하게 한다; 강력한 컴파일 시간 유형 점검의 존재는 시험 주도 개발 같은 다른 신뢰성 기법이 없는 프로그램들을 더 신뢰할 수 있게 하는 반면, 유형 추론은 프로그래머가 대부분의 ca에서 컴파일러에 유형을 수동으로 선언할 필요를 덜어준다.세스

Coq, Agda, Cayenne, Epigram과 같은 일부 연구 지향적인 기능 언어들은 직관적 유형 이론에 바탕을 두고 있는데, 이 이론은 유형에 따라 달라지게 한다.그러한 유형을 종속형이라고 한다.이러한 형식 시스템은 결정 가능한 형식의 추론을 가지고 있지 않으며 이해하기 어렵고 프로그래밍하기 어렵다.[61][62][63][64]그러나 의존형태는 자의적인 명제를 고차원의 논리로 표현할 수 있다.Curry-Howard 이소모르피즘을 통해, 이러한 언어의 잘 만들어진 프로그램들은 컴파일러가 인증된 코드를 생성할 수 있는 공식적인 수학적 증거를 작성하는 수단이 된다.이들 언어는 주로 학문적 연구(형식화된 수학 포함)에 관심이 있는 반면, 공학에도 활용되기 시작했다.Compcert는 Coq로 작성되어 정식으로 검증된 C 프로그래밍 언어의 서브셋을 위한 컴파일러다.[65]

일반화된 대수 데이터 유형(GADT)이라고 불리는 제한된 형태의 종속형태를 대부분의 불편함을 피하면서 의존적으로 타이핑된 프로그래밍의 장점을 일부 제공하는 방식으로 구현할 수 있다.[66]GADT는 Glasgow Haskell Compiler, OCaml[67]Scala에서 사용할 수 있으며,[68] Java와 C#[69]를 포함한 다른 언어의 추가 기능으로 제안되었다.

참조 투명도

기능적 프로그램에는 할당 명세서, 즉 기능적 프로그램의 변수 값이 한번 정의되면 절대 변하지 않는다.이것은 어떤 변수든 실행 시점에서 그것의 실제 값으로 대체될 수 있기 때문에 부작용의 가능성을 없앤다.그래서 기능적인 프로그램은 참조적으로 투명하다.[70]

C 할당 명세서 고려x = x * 10, 이것은 변수에 할당된 값을 변경한다.x. 의 초기 가치는 다음과 같다.x있었다1, 그런 다음 변수에 대한 연속적인 두 가지 평가x수확하다10그리고100각각분명히, 교체.x = x * 10어느 쪽이든10또는100프로그램에 다른 의미를 부여하고, 따라서 표현은 참조적으로 투명하지 않다.사실, 과제 서술문은 결코 참조적으로 투명하지 않다.

이제 다음과 같은 다른 기능을 고려하십시오.int plusone(int x) {return x+1;} 입력 x를 암시적으로 변경하지 않기 때문에 그러한 부작용이 없기 때문에 투명하다.기능 프로그램은 이러한 유형의 기능을 독점적으로 사용하므로 참조적으로 투명하다.

데이터 구조

순전히 기능적인 데이터 구조는 종종 필수 요소와는 다른 방식으로 표현된다.[71]예를 들어, 일정한 액세스와 업데이트 시간을 갖는 배열은 가장 필수적인 언어의 기본 구성요소로서 해시 테이블이진 힙과 같은 많은 필수 데이터 구조는 배열을 기반으로 한다.어레이를 이나 랜덤 액세스 목록으로 대체할 수 있는데, 이는 순수하게 기능적인 구현은 인정하지만 로그 액세스와 업데이트 시간이 있다.순수하게 기능적인 데이터 구조는 지속성을 가지고 있는데, 이는 이전 버전의 데이터 구조를 수정하지 않은 상태로 유지하는 속성이다.Clojure에서, 영구적인 데이터 구조는 필수적 데이터 구조에 대한 기능적 대안으로 사용된다.예를 들어, 영구 벡터는 부분 업데이트에 트리를 사용한다.삽입 방법을 호출하면 일부 노드가 생성되지만 일부 노드는 생성되지 않는다.[72]

명령형 프로그래밍과 비교

기능적 프로그래밍은 명령적 프로그래밍과는 매우 다르다.가장 큰 차이는 기능 프로그래밍이 부작용을 회피한다는 사실에서 비롯되는데, 이는 상태와 I/O를 구현하기 위한 필수 프로그래밍에 사용된다.순수 기능 프로그래밍은 부작용을 완전히 방지하고 참조 투명성을 제공한다.

고차 함수는 구형 명령 프로그래밍에서 거의 사용되지 않는다.전통적인 명령 프로그램은 목록을 트래버스하고 수정하기 위해 루프를 사용할 수 있다.반면 기능 프로그램은 기능과 목록을 가져가는 고차 "맵" 기능을 사용하여 각 목록 항목에 기능을 적용함으로써 새로운 목록을 생성하고 반환할 수 있다.

필수적 대 기능적 프로그래밍

다음의 두 가지 예(JavaScript에서 작성된)는 동일한 효과를 얻는다: 배열의 짝수 숫자를 모두 10으로 곱하고 모두 더하여 최종 합을 "결과" 변수에 저장한다.

기존의 커맨드 루프:

경시하다 숫자 목록 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; 하게 하다 결과 = 0; 을 위해 (하게 하다 i = 0; i < 숫자 목록.길이; i++) {   만일 (숫자 목록[i] % 2 === 0) {     결과 += 숫자 목록[i] * 10;   } } 

고차 함수를 사용하는 기능 프로그래밍:

경시하다 결과 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]                .여과하다(n => n % 2 === 0)                .지도를 그리다(a => a * 10)                .줄이다((a, b) => a + b); 

시뮬레이션 상태

종종 주정부와 함께 가장 자연스럽게 이행되는 것처럼 보이는 과제(예: 은행계좌 잔액 유지)가 있다.순수 기능 프로그래밍은 이러한 작업을 수행하며, 사용자 입력 및 화면 인쇄 수락과 같은 I/O 작업을 다른 방식으로 수행한다.

순수한 기능 프로그래밍 언어 하스켈카테고리 이론에서 파생된 모나드를 사용하여 그것들을 구현한다.모나드는 돌연변이 상태(및 I/O와 같은 기타 부작용)를 포함한 특정 유형의 계산 패턴을 순도를 잃지 않고 필수적으로 추출할 수 있는 방법을 제공한다.기존 모노드는 적절한 템플릿과 예를 들어 프로그램에 적용하기가 쉬울 수 있지만, 예를 들어 새로운 모노드(특정 유형의 라이브러리에 필요한 경우도 있음)를 정의하도록 요청했을 때 많은 학생들은 모노드를 개념적으로 이해하기가 어렵다는 것을 알게 된다.[73]

기능 언어 또한 불변의 상태를 전달하여 상태를 시뮬레이션한다.이것은 함수가 국가를 매개 변수의 하나로 받아들이게 하고, 그 결과와 함께 새로운 상태를 반환함으로써 구 상태를 변경하지 않고 그대로 둘 수 있다.[74]

불순한 기능 언어에는 보통 변이 가능한 상태를 보다 직접적으로 관리하는 방법이 포함된다.예를 들어, Clojure는 현재 상태에 순수한 기능을 적용하여 업데이트할 수 있는 관리되는 참조를 사용한다.이러한 종류의 접근방식은 돌연변이를 가능하게 하면서 동시에 순수한 기능의 사용을 연산 표현에 선호되는 방법으로 촉진한다.[citation needed]

프로그램의 부작용을 추적할 수 있는 호어 논리, 고유성 등 대안적 방법이 개발됐다.일부 현대 연구 언어들은 부작용의 존재를 분명히 하기 위해 효과 시스템을 사용한다.[citation needed]

효율성 문제

기능 프로그래밍 언어는 일반적으로 C, Pascal과 같은 필수 언어보다 CPU와 메모리를 사용하는 데 덜 효율적이다.[75]이는 어레이와 같은 일부 변이성 데이터 구조가 현재의 하드웨어를 사용하여 매우 간단한 구현을 한다는 사실과 관련이 있다.평면 어레이는 파이프라인 CPU로 매우 효율적으로 액세스하거나 캐시를 통해 효율적으로 프리페치하거나(복잡한 포인터 추적 없이), SIMD 지침으로 처리할 수 있다.또한 똑같이 효율적인 범용 불변의 상대를 만드는 것도 쉽지 않다.순기능 언어의 경우, 변이 가능한 메모리는 로그 액세스 시간(균형화된 트리 등)이 있는 순기능 데이터 구조로 대표될 수 있기 때문에 최악의 경우 감속은 사용되는 메모리 셀의 수에 있어서 로그다.[76]그러나 이러한 둔화는 보편적이지 않다.집중적인 숫자 계산을 수행하는 프로그램의 경우, 컴퓨터 언어 벤치마크 게임에 따르면 OCaml, Clean 등의 기능 언어는 C보다 약간 느릴 뿐이다.[77]대형 행렬과 다차원 데이터베이스를 처리하는 프로그램의 경우, 배열 기능 언어(J, K 등)는 속도 최적화를 통해 설계되었다.

데이터의 불변성은 컴파일러가 필수 언어로 안전하지 않은 가정을 할 수 있게 하여 인라인 확장의 기회를 증가시킴으로써 많은 경우에 실행 효율성으로 이어질 수 있다.[78]

게으른 평가는 또한 프로그램 속도를 무증상적으로라도 높일 수 있는 반면, 최대 일정 요소만큼 프로그램 속도를 늦출 수 있다(그러나 부적절하게 사용하면 메모리 누수를 초래할 수 있다).Launchbury 1993은[59] 게으른 평가로 인한 메모리 누수와 관련된 이론적인 문제를 논의하며, 오설리반 외 2008[79] 그것들을 분석하고 고치기 위한 몇 가지 실용적인 조언을 한다.그러나 참조되지 않은 코드와 데이터를 광범위하게 사용하는 게으른 평가의 가장 일반적인 구현은 깊은 파이프라인과 다단계 캐시(캐시 누락에 수백 사이클이 소요될 수 있음)가 있는 현대적 프로세서에서 저조한 성능을 발휘한다.[citation needed]

비기능 언어의 기능 프로그래밍

전통적으로 기능언어로 간주되지 않는 언어에서는 기능적인 프로그래밍 스타일을 사용할 수 있다.[80]예를 들어, D[81] Fortran 95[52] 모두 명시적으로 순수한 기능을 지원한다.

자바스크립트, 루아,[82] 피톤, 바둑[83] 초기부터 1등급을 가지고 있었다.[84]파이썬은 1994년 '람다', '', '리듀스', '필터' 등의 지원을 받았으며, 파이썬3는 '리듀스'를 '리듀스'로 강등시켰지만 파이썬2.2의 폐쇄도 함께 했다.[85]functools표준 라이브러리 모듈.[86]1등급 기능은 PHP 5.3, Visual Basic 9, C# 3.0, C++11, 코틀린 등의 다른 주류 언어에 도입되었다.[27][citation needed]

PHP에서는 익명수업, 폐업, 람다 등이 전폭적으로 지원된다.불변의 데이터 구조를 위한 라이브러리와 언어 확장은 기능적 스타일의 프로그래밍을 돕기 위해 개발되고 있다.

자바에서, 익명 수업때때로 폐쇄를 모의 실험하기 위해 사용될 수 있다.[87] 그러나 익명 수업은 그들이 더 제한된 능력을 가지고 있기 때문에 항상 폐쇄를 대체할 적절한 것은 아니다.[88]Java 8은 일부 익명 클래스의 대체물로 람다 식을 지원한다.[89]

C#에서는 폐업과 람다 등이 전폭적으로 지원되기 때문에 익명 수업은 필요하지 않다.불변의 데이터 구조를 위한 라이브러리와 언어 확장은 C#의 기능적 스타일로 프로그래밍하는 것을 돕기 위해 개발되고 있다.

많은 객체 지향 설계 패턴은 기능 프로그래밍 용어로 표현 가능하다. 예를 들어, 전략 패턴은 단순히 고차 함수의 사용을 지시하고, 방문자 패턴은 대략 강직성 또는 접힘에 해당한다.

마찬가지로 기능 프로그래밍의 불변 데이터 개념은 흔히 명령적 프로그래밍 언어에 포함되는데,[90] 예를 들어 불변 배열인 파이썬의 튜플과 오브젝트 등이 그것이다.자바스크립트에서 freeze()[91]

적용들

스프레드시트

스프레드시트는 순정, 제로 주문, 엄격한 평가 기능 프로그래밍 시스템의 한 형태로 간주될 수 있다.[92]그러나 스프레드시트는 일반적으로 코드 재사용뿐만 아니라 고차 기능도 결여되어 있으며, 일부 구현에서는 재귀도 있다.더 높은 순서와 재사용 가능한 기능을 가능하게 하기 위해 스프레드시트 프로그램을 위해 몇 개의 확장 프로그램이 개발되었지만, 지금까지는 주로 학문적인 것으로 남아 있다.[93]

학계

기능 프로그래밍은 프로그래밍 언어 이론 분야에서 활발한 연구 영역이다.기능 프로그래밍에 관한 국제 회의, 기능 프로그래밍 저널, 기능 프로그래밍 경향 심포지엄 등 기능 프로그래밍에 초점을 맞춘 동료 검토 출판 장소가 여럿 있다.

산업

기능성 프로그래밍은 다양한 산업용 응용 분야에서 사용되어 왔다.일례로 1980년대 후반 스웨덴 기업 에릭슨이 개발한 에를랑은 원래 내결함성 통신 시스템을 구현하는 데 사용됐지만 이후 노텔, 페이스북, 엘렉트리시테프랑스, 왓츠앱 등 기업에서 다양한 애플리케이션을 구축해 인기를 끌었다.[11][10][12][94][95][96]Lisp의 방언인 Scheme은 초기 애플 매킨토시 컴퓨터의 여러 응용 프로그램의 기반으로 사용되었고,[3][4] 훈련 시뮬레이션 소프트웨어[5] 망원경 제어와 같은 문제에 적용되어 왔다.[6]1990년대 중반 도입된 OCaml은 그동안 재무분석,[14] 운전자 검증, 산업용 로봇 프로그래밍, 임베디드 소프트웨어 정적 분석 등의 분야에서 상업적으로 활용돼 왔다.[15]Haskell은 처음에는 연구 언어로 의도되었지만,[17] 항공우주 시스템, 하드웨어 설계, 웹 프로그래밍과 같은 분야에서 다양한 회사들에 의해서도 적용되었다.[16][17]

산업에서 사용된 다른 기능 프로그래밍 언어로는 스칼라,[97] F#,[18][19] 울프램 언어,[7] 리스프,[98] 스탠더드 ML,[99][100] 클루주어가 있다.[101]

기능적인 "플랫폼"은 리스크 분석을 위한 금융에서 인기가 있었다(특히 더 큰 투자 은행들과 함께).위험요인은 상호의존적인 그래프(범주)를 형성하여 시장변동에서의 상관관계를 측정하는 함수로써 Gröbner 기반 최적화뿐만 아니라 포괄적 자본분석검토와 같은 규제준수에도 코딩된다.금융에서 OCAML 또는 CAML 변동을 사용하는 것을 고려할 때, 이러한 시스템은 때때로 범주형 추상 기계 또는 CAM과 관련된 것으로 간주된다.실제로 기능 프로그래밍은 범주 이론의 영향을 많이 받는다.

교육

많은 대학들이 컴퓨터 공학 학부의 일부로 기능 프로그래밍을 가르치거나 가르쳐왔다.[102][103][104][105]어떤 사람들은 그것을 프로그래밍에 대한 그들의 소개로 사용하는 반면,[105] 다른 사람들은 명령적인 프로그래밍을 가르친 후에 그것을 가르친다.[104][106]

컴퓨터 과학 외에도 기능 프로그래밍이 문제 해결, 대수학, 기하학적 개념을 가르치는 방법으로 사용되고 있다.[107]고전역학구조와 해석에서 고전역학을 가르치는 도구로도 이용되어 왔다.

참고 항목

참조

  1. ^ Hudak, Paul (September 1989). "Conception, evolution, and application of functional programming languages" (PDF). ACM Computing Surveys. 21 (3): 359–411. doi:10.1145/72551.72554. S2CID 207637854.
  2. ^ a b Hughes, John (1984). "Why Functional Programming Matters".
  3. ^ a b Clinger, Will (1987). "MultiTasking and MacScheme". MacTech. 3 (12). Retrieved 2008-08-28.
  4. ^ a b Hartheimer, Anne (1987). "Programming a Text Editor in MacScheme+Toolsmith". MacTech. 3 (1). Archived from the original on 2011-06-29. Retrieved 2008-08-28.
  5. ^ a b Kidd, Eric. Terrorism Response Training in Scheme. CUFP 2007. Retrieved 2009-08-26.
  6. ^ a b Cleis, Richard. Scheme in Space. CUFP 2006. Retrieved 2009-08-26.
  7. ^ a b "Wolfram Language Guide: Functional Programming". 2015. Retrieved 2015-08-24.
  8. ^ "Functional vs. Procedural Programming Language". Department of Applied Math. University of Colorado. Archived from the original on 2007-11-13.
  9. ^ "State-Based Scripting in Uncharted 2" (PDF). Archived from the original (PDF) on 2012-12-15. Retrieved 2011-08-08.
  10. ^ a b "Who uses Erlang for product development?". Frequently asked questions about Erlang. Retrieved 2018-04-27.
  11. ^ a b Armstrong, Joe (June 2007). A history of Erlang. Third ACM SIGPLAN Conference on History of Programming Languages. San Diego, California. doi:10.1145/1238844.1238850.
  12. ^ a b Larson, Jim (March 2009). "Erlang for concurrent programming". Communications of the ACM. 52 (3): 48. doi:10.1145/1467247.1467263. S2CID 524392.
  13. ^ "The Elixir Programming Language". Retrieved 2021-02-14.
  14. ^ a b Minsky, Yaron; Weeks, Stephen (July 2008). "Caml Trading — experiences with functional programming on Wall Street". Journal of Functional Programming. 18 (4): 553–564. doi:10.1017/S095679680800676X. S2CID 30955392. Retrieved 2008-08-27.
  15. ^ a b Leroy, Xavier. Some uses of Caml in Industry (PDF). CUFP 2007. Retrieved 2009-08-26.
  16. ^ a b "Haskell in industry". Haskell Wiki. Retrieved 2009-08-26. Haskell has a diverse range of use commercially, from aerospace and defense, to finance, to web startups, hardware design firms and lawnmower manufacturers.
  17. ^ a b c Hudak, Paul; Hughes, J.; Jones, S. P.; Wadler, P. (June 2007). A history of Haskell: being lazy with class. Third ACM SIGPLAN Conference on History of Programming Languages. San Diego, California. doi:10.1145/1238844.1238856. Retrieved 2013-09-26.
  18. ^ a b Mansell, Howard (2008). Quantitative Finance in F#. CUFP 2008. Retrieved 2009-08-29.
  19. ^ a b Peake, Alex (2009). The First Substantial Line of Business Application in F#. CUFP 2009. Archived from the original on 2009-10-17. Retrieved 2009-08-29.
  20. ^ comments, 27 Jun 2017 Matt Banz Feed 603up 2. "An introduction to functional programming in JavaScript". Opensource.com. Retrieved 2021-01-09.
  21. ^ "The useR! 2006 conference schedule includes papers on the commercial use of R". R-project.org. 2006-06-08. Retrieved 2011-06-20.
  22. ^ Chambers, John M. (1998). Programming with Data: A Guide to the S Language. Springer Verlag. pp. 67–70. ISBN 978-0-387-98503-9.
  23. ^ Novatchev, Dimitre. "The Functional Programming Language XSLT — A proof through examples". Retrieved May 27, 2006.
  24. ^ Mertz, David. "XML Programming Paradigms (part four): Functional Programming approached to XML processing". IBM developerWorks. Retrieved May 27, 2006.
  25. ^ Chamberlin, Donald D.; Boyce, Raymond F. (1974). "SEQUEL: A structured English query language". Proceedings of the 1974 ACM SIGFIDET: 249–264.
  26. ^ Functional Programming with C# - Simon Painter - NDC Oslo 2020, archived from the original on 2021-10-30, retrieved 2021-10-23
  27. ^ a b "Functional programming - Kotlin Programming Language". Kotlin. Retrieved 2019-05-01.
  28. ^ Dominus, Mark J. (2005). Higher-Order Perl. Morgan Kaufmann. ISBN 978-1-55860-701-9.
  29. ^ Holywell, Simon (2014). Functional Programming in PHP. php[architect]. ISBN 9781940111056.
  30. ^ The Cain Gang Ltd. "Python Metaclasses: Who? Why? When?" (PDF). Archived from the original (PDF) on 30 May 2009. Retrieved 27 June 2009.
  31. ^ "GopherCon 2020: Dylan Meeus - Functional Programming with Go". YouTube.com.{{cite web}}: CS1 maint : url-status (링크)
  32. ^ "Functional Language Features: Iterators and Closures - The Rust Programming Language". doc.rust-lang.org. Retrieved 2021-01-09.
  33. ^ Vanderbauwhede, Wim. "Cleaner code with functional programming". Archived from the original on 11 Sep 2020. Retrieved 6 October 2020.
  34. ^ "Effective Scala". Scala Wiki. Retrieved 2012-02-21. Effective Scala.
  35. ^ "Documentation for package java.util.function since Java 8 (also known as Java 1.8)". Retrieved 2021-06-16.
  36. ^ Turing, A. M. (1937). "Computability and λ-definability". The Journal of Symbolic Logic. Cambridge University Press. 2 (4): 153–163. doi:10.2307/2268280. JSTOR 2268280.
  37. ^ Haskell Brooks Curry; Robert Feys (1958). Combinatory Logic. North-Holland Publishing Company. Retrieved 10 February 2013.
  38. ^ Church, A. (1940). "A Formulation of the Simple Theory of Types". Journal of Symbolic Logic. 5 (2): 56–68. doi:10.2307/2266170. JSTOR 2266170.
  39. ^ McCarthy, John (June 1978). History of Lisp (PDF). History of Programming Languages. Los Angeles, CA. pp. 173–185. doi:10.1145/800025.808387.
  40. ^ John McCarthy (1960). "Recursive functions of symbolic expressions and their computation by machine, Part I." (PDF). Communications of the ACM. ACM New York, NY, USA. 3 (4): 184–195. doi:10.1145/367177.367199. S2CID 1489409.
  41. ^ Guy L. Steele; Richard P. Gabriel (February 1996). The Evolution of Lisp (PDF). In ACM/SIGPLAN Second History of Programming Languages. pp. 233–330. doi:10.1145/234286.1057818. ISBN 978-0-201-89502-5. S2CID 47047140.
  42. ^ 허버트 A의 회고록. 시몬(1991) '내 삶의 모델' pp.189-190 ISBN 0-465-04640-1은 자신과 앨 뉴웰, 클리프 쇼가 ''인공지능[필드]의 부모'로 판단된다''는 주장을 펼친다. 로직 이론가프린키시아 매티카타에서 자동으로 이론을 증명하는 프로그램이다.이를 위해, 그들은 기능적 프로그래밍을 포함하는 언어와 패러다임을 발명해야 했다.
  43. ^ Backus, J. (1978). "Can programming be liberated from the von Neumann style?: A functional style and its algebra of programs". Communications of the ACM. 21 (8): 613–641. doi:10.1145/359576.359579.
  44. ^ R.M. 버스타올.기능 프로그래밍 언어에 대한 설계 고려사항.초대받은 논문이야, 프락인포텍 아트 컨프 상태"소프트웨어 혁명", 코펜하겐, 45–57 (1977년)
  45. ^ R.M. 버스타올과 J. 달링턴.재귀 프로그램 개발을 위한 변환 시스템.컴퓨터 기계 협회 제24권:44-67호 (1977년)
  46. ^ R.M. 버스타올, D.B. 맥퀸, D.T. 산넬라.호프: 실험적인 응용 언어.Proc. 1980년 LISP 컨퍼런스, 스탠포드, 136–143(1980년)
  47. ^ "Make discovering assign() easier!". OpenSCAD.
  48. ^ Peter Bright (March 13, 2018). "Developers love trendy new languages but earn more with functional programming". Ars Technica.
  49. ^ John Leonard (January 24, 2017). "The stealthy rise of functional programming". Computing.
  50. ^ Leo Cheung (May 9, 2017). "Is functional programming better for your startup?". InfoWorld.
  51. ^ Pountain, Dick. "Functional Programming Comes of Age". BYTE.com (August 1994). Archived from the original on 2006-08-27. Retrieved August 31, 2006.
  52. ^ a b "ISO/IEC JTC 1/SC 22/WG5/N2137". International Organization for Standardization. July 6, 2017. {{cite journal}}:Cite 저널은 필요로 한다. journal=(도움말)
  53. ^ "Revised^6 Report on the Algorithmic Language Scheme". R6rs.org. Retrieved 2013-03-21.
  54. ^ "Revised^6 Report on the Algorithmic Language Scheme - Rationale". R6rs.org. Retrieved 2013-03-21.
  55. ^ Clinger, William (1998). "Proper tail recursion and space efficiency". Proceedings of the ACM SIGPLAN 1998 conference on Programming language design and implementation - PLDI '98. pp. 174–185. doi:10.1145/277650.277719. ISBN 0897919874. S2CID 16812984.
  56. ^ Baker, Henry (1994). "CONS Should Not CONS Its Arguments, Part II: Cheney on the M.T.A."
  57. ^ Turner, D.A. (2004-07-28). "Total Functional Programming". Journal of Universal Computer Science. 10 (7): 751–768. doi:10.3217/jucs-010-07-0751.
  58. ^ 기능 프로그래밍 언어의 구현.1987년 프렌티스 홀에서 출판된 사이먼 페이튼 존스
  59. ^ a b John Launchbury (1993). "A Natural Semantics for Lazy Evaluation". CiteSeerX 10.1.1.35.2016. {{cite journal}}:Cite 저널은 필요로 한다. journal=(도움말)
  60. ^ Robert W. Harper (2009). Practical Foundations for Programming Languages (PDF). Archived from the original (PDF) on 2016-04-07.
  61. ^ Huet, Gérard P. (1973). "The Undecidability of Unification in Third Order Logic". Information and Control. 22 (3): 257–267. doi:10.1016/s0019-9958(73)90301-x.
  62. ^ Huet, Gérard (Sep 1976). Resolution d'Equations dans des Langages d'Ordre 1,2,...ω (Ph.D.) (in French). Universite de Paris VII.
  63. ^ Huet, Gérard (2002). "Higher Order Unification 30 years later" (PDF). In Carreño, V.; Muñoz, C.; Tahar, S. (eds.). Proceedings, 15th International Conference TPHOL. LNCS. Vol. 2410. Springer. pp. 3–12.
  64. ^ Wells, J. B. (1993). "Typability and type checking in the second-order lambda-calculus are equivalent and undecidable". Tech. Rep. 93-011. CiteSeerX 10.1.1.31.3590.
  65. ^ Leroy, Xavier (17 September 2018). "The Compcert verified compiler".
  66. ^ Peyton Jones, Simon; Vytiniotis, Dimitrios; Weirich, Stephanie; Geoffrey Washburn (April 2006). "Simple unification-based type inference for GADTs". ICFP 2006: 50–61.
  67. ^ "OCaml Manual". caml.inria.fr. Retrieved 2021-03-08.{{cite web}}: CS1 maint : url-status (링크)
  68. ^ "Algebraic Data Types". Scala Documentation. Retrieved 2021-03-08.
  69. ^ Kennedy, Andrew; Russo, Claudio (October 2005). Generalized Algebraic Data Types and Object-Oriented Programming (PDF). OOPSLA. San Diego, California. ISBN 9781595930316. Archived from the original (PDF) on 2006-12-29. 인용의 출처
  70. ^ Hughes, John. "Why Functional Programming Matters" (PDF). Chalmers University of Technology.
  71. ^ Chris Okasaki, Cambridge University Press, 1998, ISBN 0-521-66350-4순기능 데이터 구조
  72. ^ L’orange, Jean Niklas. "polymatheia - Understanding Clojure's Persistent Vector, pt. 1". Polymatheia. Retrieved 2018-11-13.
  73. ^ Newbern, J. "All About Monads: A comprehensive guide to the theory and practice of monadic programming in Haskell". Retrieved 2008-02-14.
  74. ^ "Thirteen ways of looking at a turtle". fF# for fun and profit. Retrieved 2018-11-13.
  75. ^ Paulson, Larry C. (28 June 1996). ML for the Working Programmer. Cambridge University Press. ISBN 978-0-521-56543-1. Retrieved 10 February 2013.
  76. ^ Spiewak, Daniel (26 August 2008). "Implementing Persistent Vectors in Scala". Code Commit.
  77. ^ "Which programs are fastest? Computer Language Benchmarks Game". benchmarksgame.alioth.debian.org. Archived from the original on 2013-05-20. Retrieved 2011-06-20.
  78. ^ Igor Pechtchanski; Vivek Sarkar (2005). "Immutability specification and its applications". Concurrency and Computation: Practice and Experience. 17 (5–6): 639–662. doi:10.1002/cpe.853. S2CID 34527406.
  79. ^ "Chapter 25. Profiling and optimization". Book.realworldhaskell.org. Retrieved 2011-06-20.
  80. ^ Hartel, Pieter; Henk Muller; Hugh Glaser (March 2004). "The Functional C experience" (PDF). Journal of Functional Programming. 14 (2): 129–135. doi:10.1017/S0956796803004817. S2CID 32346900.; (1부, 2부)
  81. ^ "Functions — D Programming Language 2.0". Digital Mars. 30 December 2012.
  82. ^ "Lua Unofficial FAQ (uFAQ)".
  83. ^ "First-Class Functions in Go - The Go Programming Language". golang.org. Retrieved 2021-01-04.
  84. ^ Eich, Brendan (3 April 2008). "Popularity".
  85. ^ van Rossum, Guido (2009-04-21). "Origins of Python's "Functional" Features". Retrieved 2012-09-27.
  86. ^ "functools — Higher order functions and operations on callable objects". Python Software Foundation. 2011-07-31. Retrieved 2011-07-31.
  87. ^ Skarsaune, Martin (2008). The SICS Java Port Project Automatic Translation of a Large Object Oriented System from Smalltalk to Java.
  88. ^ Gosling, James. "Closures". James Gosling: on the Java Road. Oracle. Archived from the original on 2013-04-14. Retrieved 11 May 2013.
  89. ^ Williams, Michael (8 April 2013). "Java SE 8 Lambda Quick Start".
  90. ^ Bloch, Joshua (2008). "Item 15: Minimize Mutability". Effective Java (Second ed.). Addison-Wesley. ISBN 978-0321356680.
  91. ^ "Object.freeze() - JavaScript MDN". developer.mozilla.org. Retrieved 2021-01-04. The Object.freeze() method freezes an object. A frozen object can no longer be changed; freezing an object prevents new properties from being added to it, existing properties from being removed, prevents changing the enumerability, configurability, or writability of existing properties, and prevents the values of existing properties from being changed. In addition, freezing an object also prevents its prototype from being changed. freeze() returns the same object that was passed in.{{cite web}}: CS1 maint : url-status (링크)
  92. ^ Wakeling, David (2007). "Spreadsheet functional programming" (PDF). Journal of Functional Programming. 17 (1): 131–143. doi:10.1017/S0956796806006186. ISSN 0956-7968. S2CID 29429059.
  93. ^ Peyton Jones, Simon; Burnett, Margaret; Blackwell, Alan (March 2003). "Improving the world's most popular functional language: user-defined functions in Excel". Archived from the original on 2005-10-16.
  94. ^ Piro, Christopher (2009). Functional Programming at Facebook. CUFP 2009. Archived from the original on 2009-10-17. Retrieved 2009-08-29.
  95. ^ "Sim-Diasca: a large-scale discrete event concurrent simulation engine in Erlang". November 2011.
  96. ^ 100만개는 2011년 // WhatsApp 블로그, 2012-01-06: "인프라의 마지막 중요한 부분은 Erlang"
  97. ^ Momtahan, Lee (2009). Scala at EDF Trading: Implementing a Domain-Specific Language for Derivative Pricing with Scala. CUFP 2009. Archived from the original on 2009-10-17. Retrieved 2009-08-29.
  98. ^ Graham, Paul (2003). "Beating the Averages". Retrieved 2009-08-29.
  99. ^ Sims, Steve (2006). Building a Startup with Standard ML (PDF). CUFP 2006. Retrieved 2009-08-29.
  100. ^ Laurikari, Ville (2007). Functional Programming in Communications Security. CUFP 2007. Retrieved 2009-08-29.
  101. ^ Lorimer, R. J. (19 January 2009). "Live Production Clojure Application Announced". InfoQ.
  102. ^ "Functional Programming: 2019-2020". University of Oxford Department of Computer Science. Retrieved 28 April 2020.
  103. ^ "Programming I (Haskell)". Imperial College London Department of Computing. Retrieved 28 April 2020.
  104. ^ a b "Computer Science BSc - Modules". Retrieved 28 April 2020.
  105. ^ a b Abelson, Hal; Sussman, Gerald Jay (1985). "Preface to the Second Edition". Structure and Interpretation of Computer Programs (2 ed.). MIT Press.
  106. ^ John DeNero (Fall 2019). "Computer Science 61A, Berkeley". Department of Electrical Engineering and Computer Sciences, Berkeley. Retrieved 2020-08-14.
  107. ^ 부트스트랩의 에마뉘엘 샨저TWiT.tv 네트워크의 TV 쇼 Triangulation에서 인터뷰했다.

추가 읽기

외부 링크

이 기사 듣기(28분)
Spoken Wikipedia icon
이 오디오 파일은 2011년 8월 25일(2011-08-25) 날짜의 본 기사의 개정으로 생성되었으며, 이후 편집된 내용을 반영하지 않는다.