[python] 파이썬이 함수형 프로그래밍에 왜 좋지 않은가요? [닫은]

나는 항상 함수형 프로그래밍이 파이썬에서 이루어질 수 있다고 생각했습니다. 따라서 파이썬 이이 질문 에 대해 언급하지 않았으며, 언급 되었을 때 일반적으로 매우 긍정적이지 않은 것에 놀랐습니다 . 그러나 이에 대한 많은 이유는 없었습니다 (패턴 일치 부족 및 대수 데이터 형식이 언급되었습니다). 그래서 내 질문은 : 왜 파이썬은 함수형 프로그래밍에 좋지 않습니까? 패턴 일치 및 대수 데이터 형식이 부족한 것보다 더 많은 이유가 있습니까? 또는 이러한 개념이 기능 프로그래밍에 매우 중요하여이를 지원하지 않는 언어는 2 차 기능 프로그래밍 언어로만 분류 될 수 있습니까? (함수 프로그래밍에 대한 나의 경험은 상당히 제한되어 있음을 명심하십시오.)



답변

당신이 참조하는 질문은 어느 언어가 OO와 함수형 프로그래밍을 홍보하는지 묻습니다. 파이썬은 상당히 잘 작동 하더라도 함수형 프로그래밍을 장려 하지 않습니다 .

파이썬 에서 함수형 프로그래밍에 대한 가장 좋은 주장 은 Guido에서 명령형 / OO 유스 케이스를 신중하게 고려하지만 함수형 프로그래밍 유스 케이스는 그렇지 않다는 것입니다. 명령형 Python을 작성할 때 가장 잘 알려진 언어 중 하나입니다. 함수형 파이썬을 작성할 때, BDFL 이없는 일반 언어만큼 추악하고 불쾌합니다 .

기능적 프로그래밍을 장려하는 언어로 전환하거나 OO Python 작성으로 전환 한 경우보다 더 열심히 노력해야한다는 것은 나쁜 일이 아닙니다.

파이썬에서 내가 놓친 기능적인 내용은 다음과 같습니다.


  • 패턴 일치와 테일 재귀가 없다는 것은 기본 알고리즘을 반드시 작성해야한다는 것을 의미합니다. 재귀는 파이썬에서 추악하고 느립니다.
  • 작은 목록 라이브러리와 기능 사전이 없으면 많은 것을 직접 작성해야합니다.
  • 카레 또는 구성에 대한 구문이 없다는 것은 포인트없는 스타일이 인수를 명시 적으로 전달하는 것처럼 구두점으로 가득하다는 것을 의미합니다.
  • 게으른 목록 대신 반복자는 효율성 또는 지속성을 원하는지 여부를 알고 지속성 list을 원하면 주변으로 호출을 분산시켜야 함을 의미합니다 . (반복자는 한번만 사용)
  • 파이썬의 간단한 명령 구문은 간단한 LL1 파서와 함께 if-expression과 lambda-expression에 대한 더 좋은 구문은 기본적으로 불가능하다는 것을 의미합니다. 귀도는 이런 식으로 그것을 좋아하고 나는 그가 옳다고 생각합니다.

답변

귀도는 여기에 대한 좋은 설명이 있습니다 . 가장 관련성이 높은 부분은 다음과 같습니다.

나는 사람들이 말하거나 생각하는 것에 상관없이 파이썬이 기능적 언어에 의해 크게 영향을받는 것으로 간주하지 않았습니다. 나는 C와 Algol 68과 같은 명령형 언어에 훨씬 익숙했고 함수를 일급 객체로 만들었지 만 파이썬을 함수형 프로그래밍 언어로 보지 않았습니다. 그러나 이전에는 사용자가 목록과 기능으로 더 많은 것을 원한다는 것이 분명했습니다.

파이썬을 기능적 언어로 구상하지는 않았지만 클로저 도입은 다른 많은 고급 프로그래밍 기능 개발에 유용했습니다. 예를 들어, 새로운 스타일의 클래스, 데코레이터 및 기타 최신 기능의 특정 측면은이 기능에 의존합니다.

마지막으로, 몇 년 동안 많은 기능적 프로그래밍 기능이 소개되었지만 파이썬에는 여전히 “실제”기능적 프로그래밍 언어에서 볼 수있는 특정 기능이 없습니다. 예를 들어, 파이썬은 특정 종류의 최적화 (예 : 꼬리 재귀)를 수행하지 않습니다. 일반적으로 파이썬은 매우 역동적이므로 Haskell 또는 ML과 같은 기능적 언어에서 알려진 종류의 컴파일 타임 최적화를 수행 할 수 없습니다. 그리고 괜찮습니다.

나는 이것에서 두 가지를 뽑습니다.

  1. 언어를 만든 사람은 실제로 파이썬을 기능적 언어로 생각하지 않습니다. 따라서 “기능적 기능”기능을 볼 수는 있지만 기능적으로 확실한 기능은 볼 수 없습니다.
  2. 파이썬의 동적 특성은 다른 기능적 언어에서 볼 수있는 일부 최적화를 방해합니다. 물론 Lisp는 파이썬만큼이나 역동적이지만 (동적이 아닌 경우) 부분 설명 일뿐입니다.

답변

체계에는 대수적 데이터 유형이나 패턴 일치가 없지만 확실히 기능적인 언어입니다. 함수형 프로그래밍 관점에서 파이썬에 대한 성가신 것들 :

  1. 절름발이 람다. Lambdas는 표현식 만 포함 할 수 있으며 표현식 컨텍스트에서 모든 것을 쉽게 수행 할 수 없으므로 “즉시”정의 할 수있는 기능이 제한되어 있습니다.

  2. if는 표현이 아니라 서술문입니다. 이것은 무엇보다도 내부에 If가있는 람다를 가질 수 없다는 것을 의미합니다. (이것은 Python 2.5에서 3 진으로 수정되었지만 추악하게 보입니다.)

  3. 귀도는 위협 지도, 필터를 제거하고, 절감 한 동안 한 번씩을

다른 한편으로, 파이썬은 어휘 폐쇄, 람다 및리스트 이해 (구도가 인정하는지 여부에 관계없이 실제로 “기능적”개념 임)를 나열합니다. 나는 파이썬에서 “기능적 스타일”프로그래밍을 많이하지만, 그것이 이상적인 것이라고는 거의 말할 수 없다.


답변

필자는 파이썬을 “기능적”이라고 부르지 않지만 파이썬으로 프로그램 할 때마다 코드는 거의 순전히 기능적으로 끝납니다.

틀림없이 그것은 목록 이해력이 매우 뛰어 나기 때문입니다. 따라서 필연적으로 파이썬을 함수형 프로그래밍 언어로 제안하지는 않지만 파이썬을 사용하는 사람에게는 함수형 프로그래밍을 제안합니다.


답변

SO에 대한 “기능적” Python 질문 에 대한 답변에서 가져온 코드 조각으로 시연하겠습니다.

파이썬 :

def grandKids(generation, kidsFunc, val):
  layer = [val]
  for i in xrange(generation):
    layer = itertools.chain.from_iterable(itertools.imap(kidsFunc, layer))
  return layer

하스켈 :

grandKids generation kidsFunc val =
  iterate (concatMap kidsFunc) [val] !! generation

여기에 가장 큰 차이점은 하스켈의 표준 라이브러리는 함수형 프로그래밍에 대한 유용한 기능을 가지고 있다는 것입니다 :이 경우 iterate, concat(!!)


답변

이 질문 (및 답변)에 정말로 중요한 한 가지는 다음과 같습니다. 지옥은 기능 프로그래밍이란 무엇이며, 가장 중요한 속성은 무엇입니까? 나는 그것에 대한 나의 견해를 주려고 노력할 것이다.

함수형 프로그래밍은 화이트 보드에 수학을 쓰는 것과 비슷합니다. 화이트 보드에 방정식을 쓸 때 실행 순서를 생각하지 않습니다. (일반적으로) 돌연변이가 없습니다. 당신은 다음날 다시 와서 그것을 보지 않고 계산을 다시 할 때 다른 결과를 얻습니다 (또는 신선한 커피를 마셨다면 :). 기본적으로 칠판에있는 것이 있고, 글을 적을 때 이미 답이 있었지만 아직 그 내용을 깨닫지 못했습니다.

함수형 프로그래밍은 이와 매우 비슷합니다. 당신은 사물을 바꾸지 않고 단지 방정식을 평가하고 (이 경우 “프로그램”) 답이 무엇인지 알아냅니다. 프로그램은 여전히 ​​수정되지 않은 상태입니다. 데이터와 동일합니다.

다음은 함수형 프로그래밍의 가장 중요한 기능으로 다음과 같이 평가합니다. a) 참조 투명성-다른 시간과 장소에서 동일한 문장을 평가하지만 동일한 변수 값을 사용하더라도 여전히 동일한 의미를 갖습니다. b) 부작용 없음-화이트 보드를 얼마나 오래 응시하더라도 다른 사람이 다른 화이트 보드를보고있는 방정식은 우연히 변경되지 않습니다. c) 함수도 값이다. 다른 변수와 함께 전달되거나 다른 변수에 적용될 수 있습니다. d) 함수 구성, h = g · f를 수행 할 수 있으므로 g (f (..))를 호출하는 것과 동일한 새 함수 h (..)를 정의 할 수 있습니다.

이 목록은 우선 순위에 따라 참조 투명성이 가장 중요하며 부작용이 없습니다.

이제 파이썬을 통해 언어와 라이브러리가 이러한 측면을 얼마나 잘 지원하고 보장하는지 확인하면 자신의 질문에 대한 답을 얻을 수 있습니다.


답변

파이썬은 거의 기능적인 언어입니다. “기능적 라이트”입니다.

추가 기능이 있으므로 일부에 충분하지 않습니다.

또한 일부 기능이 없기 때문에 일부 기능으로는 충분하지 않습니다.

누락 된 기능은 비교적 작성하기 쉽습니다. 같은 게시물 확인 파이썬에서 FP에 있습니다.