IT TIP

함수형 프로그래밍의 핵심 개념은 무엇입니까?

itqueen 2021. 1. 10. 19:46
반응형

함수형 프로그래밍의 핵심 개념은 무엇입니까?


객체 지향 프로그래밍에서 핵심 개념은 다음과 같습니다.

  1. 캡슐화
  2. 계승,
  3. 다형성

함수형 프로그래밍에서는 무엇일까요?


함수형 프로그래밍의 필수 개념이 무엇인지에 대한 커뮤니티 합의가 없습니다. 에서 왜 함수형 프로그래밍 사항 (PDF) , 존 휴즈은 고차 기능과 게으른 평가 있다고 주장한다. 에서 머리 셔츠를 입고 : 하스켈에 회고전을 , 사이먼 페이튼 존스는 진짜 필수가 게으름하지만 순도하지 않습니다 말한다. Richard Bird는 동의 할 것입니다. 그러나 부작용이있는 프로그램을 작성하는 데 완벽하게 만족하는 Scheme 및 ML 프로그래머가 많습니다.

20 년 동안 함수형 프로그래밍을 연습하고 가르친 사람으로서 함수형 프로그래밍의 핵심이라고 널리 알려진 몇 가지 아이디어를 제공 할 수 있습니다.

  • 적절한 어휘 범위가있는 중첩 된 일급 함수 가 핵심입니다. 이 방법 당신은 자유 변수 매개 변수 또는의 지역 변수가 될 수있다 런타임에서 익명의 함수를 만들 수 있습니다 둘러싸 기능을, 당신은 데이터 구조에 넣어 당신이 반환 할 수있는 값을 얻을, 등등. (이것은 고차 함수의 가장 중요한 형태이지만 일부 고차 함수 (예 : qsort!)는 함수 언어가 아닌 C로 작성할 수 있습니다.)

  • 문제를 해결하기 위해 다른 함수와 함수를 구성하는 수단. John Hughes보다 더 잘하는 사람은 없습니다.

  • 많은 함수 프로그래머는 순도 (변이, I / O 및 예외를 포함한 효과로부터의 자유)가 함수 프로그래밍의 핵심이라고 믿습니다. 많은 기능 프로그래머는 그렇지 않습니다.

  • 다형성 은 컴파일러에 의해 적용되는지 여부에 관계없이 기능적 프로그래머의 핵심 가치입니다. 혼란스럽게도 C ++ 프로그래머는이 개념을 "일반 프로그래밍"이라고 부릅니다. 컴파일러에 의해 다형성이 적용되는 경우 일반적으로 Hindley-Milner 의 변형 이지만 더 강력한 System F 는 기능 언어의 강력한 기반이기도합니다. 그리고 Scheme, Erlang 및 Lua와 같은 언어를 사용하면 정적 유형 시스템없이 함수형 프로그래밍을 수행 할 수 있습니다.

  • 마지막으로, 대부분의 기능 프로그래머는 "재귀 유형"이라고도 하는 귀납적으로 정의 된 데이터 유형 의 가치를 믿습니다 . 정적 유형 시스템을 사용하는 언어에서는 일반적으로 "대수 데이터 유형"으로 알려져 있지만 초보 Scheme 프로그래머 용으로 작성된 자료 에서도 귀납적으로 정의 된 데이터 유형을 찾을 수 있습니다 . 귀납적으로 정의 된 유형은 일반적으로 매우 일반적인 형태의 사례 분석을 지원하는 패턴 일치 라는 언어 기능과 함께 제공됩니다 . 종종 컴파일러는 케이스를 잊은 경우 알려줄 수 있습니다. 이 언어 기능 없이는 프로그래밍하고 싶지 않습니다 (샘플링 된 사치품이 필수가 됨).


컴퓨터 과학에서 함수형 프로그래밍은 계산을 수학적 함수의 평가로 취급하고 상태 및 변경 가능한 데이터를 피하는 프로그래밍 패러다임입니다. 상태의 변화를 강조하는 명령형 프로그래밍 스타일과는 달리 함수의 적용을 강조합니다. 함수형 프로그래밍은 함수 정의, 함수 적용 및 재귀를 조사하기 위해 1930 년대에 개발 된 공식 시스템 인 람다 미적분에 뿌리를두고 있습니다. 많은 함수형 프로그래밍 언어는 람다 미적분에 대한 장식으로 볼 수 있습니다. - 위키 백과

간단히 말해서

  1. 람다 미적분
  2. 고차 함수
  3. 불변성
  4. 부작용 없음

귀하의 질문에 대한 직접적인 답은 아니지만 "객체 지향"과 함수형 프로그래밍이 반드시 상충되는 것은 아니라는 점을 지적하고 싶습니다. 당신이 인용 한 "핵심 개념"은 함수형 프로그래밍에도 적용되는보다 일반적인 대응 물을 가지고 있습니다.

보다 일반적으로 캡슐화는 모듈화입니다. 내가 아는 모든 순전히 기능적인 언어는 모듈 식 프로그래밍 을 지원 합니다 . 부작용은 캡슐화를 깨고 순수 함수에는 부작용이 없기 때문에 이러한 언어는 일반적인 "OO"품종보다 캡슐화를 더 잘 구현한다고 말할 수 있습니다 .

보다 일반적으로 상속 은 함수가 나타내는 논리적 의미 입니다. 표준 subclass -> superclass관계는 일종의 암시 적 기능입니다. 기능적 언어에서 이것은 유형 클래스 또는 암시 적으로 표현됩니다 .

"OO"학교의 다형성은 하위 유형 지정 (상속)을 통해 이루어집니다. 파라 메트릭 다형성 (일명 제네릭) 으로 알려진보다 일반적인 종류의 다형성이 있으며 , 순수 함수형 프로그래밍 언어에서 지원하는 것을 알 수 있습니다. 또한 일부는 "상위 종류"또는 고차 제네릭 ( 유형 생성자 다형성 )을 지원합니다.

제가 말하고자하는 것은 "OO의 핵심 개념"이 어떤 식 으로든 OO에만 국한되지 않는다는 것입니다. 나는, 하나,이 아니라는 것을 주장 어떤 OO의 핵심 개념은 사실.


Bangalore Functional Programming 그룹의 한 토론에서 제가 준 대답을 반복하겠습니다.

기능 프로그램은 기능으로 만 구성됩니다. 함수는 입력에서 값을 계산합니다. 이를 명령형 프로그래밍과 대조 할 수 있는데, 프로그램이 실행됨에 따라 변경 가능한 위치의 값이 변경됩니다. 즉, C 또는 Java에서 X라는 변수는 값이 변경되는 위치를 나타냅니다. 하지만 함수형 프로그래밍에서 X는 위치가 아닌 값의 이름입니다. 해당 X가 범위 내에있는 모든 경우 동일한 값을 갖습니다 (즉, 참조 적으로 투명 함). FP에서 함수는 값이기도합니다. 다른 함수에 인수로 전달할 수 있습니다. 이를 고차 함수 프로그래밍이라고합니다. 고차 함수를 사용하면 놀랍도록 다양한 패턴을 모델링 할 수 있습니다. 예를 들어 Lisp의 map 함수를 살펴보십시오. 프로그래머가 목록의 모든 요소에 대해 '무언가'를해야하는 패턴을 나타냅니다. 그 '뭔가'

As we saw, the most notable feature of FP is it's side-effect freeness. If a function does something more than computing a value from it's input, then it is causing a side-effect. Such functions are not allowed in pure FP. It is easy to test side-effect free functions. There is no global state to set-up before running the test and there is no global state to check after running the test. Each function can be tested independently just by providing it's input and examining the return value. This makes it easy to write automated tests. Another advantage of side-effect freeness is that it gives you better control on parallelism.

Many FP languages treat recursion and iteration correctly. They does this by supporting something called tail-recursion. What tail-recursion is - if a function calls itself, and it is the last thing it does, it removes the current stack frame right away. In other words, if a function calls itself tail-recursively a 1000 times, it does not grow the stack a 1000 deep. This makes special looping constructs unnecessary in these languages.

Lambda Calculus is the most boiled down version of an FP language. Higher level FP languages like Haskell get compiled to Lambda Calculus. It has only three syntactic constructs but still it is expressive enough to represent any abstraction or algorithm.

My opinion is that FP should be viewed as a meta-paradigm. We can write programs in any style, including OOP, using the simple functional abstractions provided by the Lambda Calculus.

Thanks, -- Vijay

Original discussion link: http://groups.google.co.in/group/bangalore-fp/browse_thread/thread/4c2cfa7985d7eab3


Abstraction, the process of making a function by parameterizing over some part of an expression.

Application, the process of evaluating a function by replacing its parameters with specific values.

At some level, that's all there is to it.

ReferenceURL : https://stackoverflow.com/questions/1112773/what-are-the-core-concepts-in-functional-programming

반응형