source

왜 Python이 기능적 프로그래밍에 적합하지 않은가?

itover 2023. 1. 25. 08:33
반응형

왜 Python이 기능적 프로그래밍에 적합하지 않은가?

기능 프로그래밍은 Python에서 할 수 있다고 항상 생각해 왔습니다.그래서 Python이 이 질문에서 별로 언급되지 않은 것에 놀랐고, Python이 언급되었을 때 보통 그다지 긍정적이지 않았다.그러나 이에 대한 이유는 많지 않았다(패턴 매칭 부족과 대수적 데이터 유형이 언급되었다).그래서 제가 묻고 싶은 것은 왜 Python이 기능적 프로그래밍에 적합하지 않은가 하는 것입니다.패턴 매칭과 대수적 데이터 타입이 없는 것보다 더 많은 이유가 있습니까?아니면 이러한 개념들이 함수 프로그래밍에 매우 중요하기 때문에 이를 지원하지 않는 언어는 제2급 함수 프로그래밍 언어로 분류될 수 밖에 없는 것일까요?(기능 프로그래밍에 대한 저의 경험은 매우 한정되어 있습니다.)

당신이 참조하는 질문은 어떤 언어가 OO와 기능적 프로그래밍을 촉진하는지를 묻는 질문입니다.Python은 꽤 잘 작동하지만 기능적 프로그래밍을 촉진하지 않습니다.

Python의 기능 프로그래밍에 반대하는 가장 좋은 주장은 필수/OO 사용 사례는 Guido에 의해 신중하게 고려되지만 기능 프로그래밍 사용 사례는 그렇지 않다는 것입니다.명령어 Python은 내가 아는 언어 중 가장 예쁜 언어 중 하나입니다.기능적인 Python을 쓰면 BDFL이 없는 당신의 평균 언어만큼 보기 흉하고 불쾌해집니다.

그렇다고 해서 나쁘다는 것은 아닙니다.기능 프로그래밍을 촉진하는 언어로 바꾸거나 OO Python을 쓰는 것으로 바꾸었을 경우보다 더 열심히 일해야 합니다.

다음은 Python에서 놓치고 있는 기능들입니다.


  • 패턴 매칭이나 테일 재귀가 없으면 기본 알고리즘이 필수적으로 작성되어야 합니다.Python에서는 재귀가 보기 흉하고 느립니다.
  • 작은 목록 라이브러리와 기능 사전이 없다는 것은 여러분이 직접 많은 것을 써야 한다는 것을 의미합니다.
  • 카레링이나 구문을 사용하지 않으면 포인트 프리 스타일은 명시적으로 전달되는 인수만큼 구두점이 가득하다는 것을 의미합니다.
  • 중 을 원하는지 , 콜을 하여 에 합니다.list1회 사용)
  • Python의 간단한 명령 구문과 단순한 LL1 파서는 if-expressions와 lamda-expressions에 대한 더 나은 구문은 기본적으로 불가능하다는 것을 의미합니다.귀도는 이런 방식을 좋아하고, 나는 그가 옳다고 생각한다.

Guido가 이 부분에 대해 잘 설명하고 있습니다.가장 관련성이 높은 부분은 다음과 같습니다.

Python이 사람들이 무슨 말을 하든, 어떤 생각을 하든 기능적인 언어의 영향을 많이 받는다고 생각해 본 적은 없습니다.나는 C나 Algol 68과 같은 명령어에 훨씬 더 익숙했고 함수 일급 객체를 만들었지만 Python을 함수형 프로그래밍 언어로 보지 않았다.그러나 이전에는 사용자가 목록과 기능으로 훨씬 더 많은 작업을 수행하고자 하는 것이 분명했습니다.

...

Python을 기능언어로 생각하지 않았지만 클로저의 도입은 다른 많은 고급 프로그래밍 기능의 개발에 유용했다는 점도 주목할 필요가 있다.예를 들어, 새로운 스타일의 클래스, 장식가 및 기타 현대적인 기능의 특정 측면은 이 기능에 의존합니다.

마지막으로, 수년에 걸쳐 많은 기능적 프로그래밍 기능이 도입되었지만, 파이썬은 여전히 "실제" 기능적 프로그래밍 언어에서 볼 수 있는 특정 기능이 부족하다.예를 들어 Python은 특정 종류의 최적화(예: 테일 재귀)를 수행하지 않습니다.일반적으로 Python은 매우 역동적이기 때문에 Haskell이나 ML과 같은 기능적 언어로 알려진 컴파일 시간 최적화는 불가능합니다.

여기서 두 가지를 끄집어내겠습니다.

  1. 이 언어를 만든 사람은 파이썬을 기능적인 언어로 생각하지 않는다.따라서 "기능적" 기능은 볼 수 있지만 실제로 작동하는 기능은 거의 없습니다.
  2. Python의 동적 특성은 다른 기능 언어에서 볼 수 있는 일부 최적화를 억제합니다.Lisp는 Python과 마찬가지로 역동적이기 때문에 이것은 부분적인 설명일 뿐입니다.

스킴에는 대수적 데이터 타입이나 패턴 매칭이 없지만 기능적인 언어는 분명합니다.기능적 프로그래밍의 관점에서 Python에 대해 성가신 점은 다음과 같습니다.

  1. 불구가 된 람다스.Lambdas는 표현식만 포함할 수 있고 표현식 컨텍스트에서 모든 작업을 쉽게 수행할 수 없기 때문에 "온 더 플라이"로 정의할 수 있는 함수는 제한됩니다.

  2. if는 문장이며 표현식이 아닙니다.이것은, 무엇보다도, 「If」가 들어간 람다를 가질 수 없다는 것을 의미합니다.(이것은 Python 2.5에서는 3진법으로 고정되어 있습니다만, 보기 흉합니다.)

  3. Guido는 맵 삭제, 필터링 및 축소를 때때로 위협하고 있습니다.

한편, python은 어휘적 클로징, Lambdas, list compensions(Guido가 인정하든 말든 정말 기능적인 개념)를 가지고 있다.Python에서 "기능형" 프로그래밍을 많이 하지만 이상적이라고는 할 수 없습니다.

Python을 "functional"이라고 부르지는 않겠지만 Python에서 프로그래밍을 할 때마다 코드는 거의 완전히 기능하게 됩니다.

인정하건대, 그것은 주로 매우 훌륭한 목록 이해력 때문이다.따라서 기능 프로그래밍 언어로 Python을 추천하지는 않지만 Python을 사용하는 모든 사람에게 기능 프로그래밍을 제안합니다.

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

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

서의 주요 있다는 이 Haskell은 기능 프로그래밍을 합니다.iterate,concat , , , , 입니다.(!!)

이 질문(및 답변)에서 매우 중요한 것은 다음과 같습니다.기능 프로그래밍이란 도대체 무엇이며, 그 가장 중요한 특성은 무엇입니까?제 의견을 말씀드리도록 하겠습니다.

함수 프로그래밍은 화이트보드에 수학을 쓰는 것과 비슷합니다.화이트보드에 방정식을 쓸 때는 실행 순서를 생각하지 않습니다.(일반적으로) 변환은 없습니다.다음 날 다시 와서 그것을 보지 않고 다시 계산하면 다른 결과가 나온다(혹은 신선한 커피를 마셨다면:).기본적으로, 칠판에 있는 것은 거기에 있고, 여러분이 무언가를 적기 시작했을 때 이미 답은 있었습니다. 단지 아직 무엇인지 깨닫지 못했을 뿐입니다.

함수 프로그래밍은 이와 매우 유사합니다. 사물을 변경하지 않고 방정식(이 경우 "프로그램")을 평가하여 정답을 알아냅니다.프로그램은 수정되지 않은 채 그대로 있습니다.데이터도 마찬가지입니다.

기능 프로그래밍의 가장 중요한 특징으로서 다음을 꼽을 수 있습니다.a) 참조 투명성 - 다른 시간과 장소에서 같은 문장을 평가하지만 동일한 변수 값을 갖는다면, 그것은 여전히 같은 것을 의미합니다.b) 부작용은 없습니다.화이트보드를 아무리 오래 쳐다보더라도 다른 남자가 보고 있는 방정식입니다.다른 화이트보드에서 실수로 변경되지 않습니다.c) 함수도 값입니다.d) 함수 구성에서는 h=g·f를 할 수 있으므로 g(f(..)를 호출하는 것과 동등한 새로운 함수 h(..)를 정의할 수 있습니다.

이 리스트는 나의 우선순위에 따른 것이므로 참조 투명성이 가장 중요하며 부작용은 없다.

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

Python은 거의 기능적인 언어입니다.'기능 라이트'입니다.

기능이 추가되어 있어 순수하지 않은 것도 있습니다.

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

누락된 기능은 비교적 쓰기 쉽습니다.파이썬의 FP에서 이런 게시물을 확인해 보세요.

위에서 언급하지 않은 또 다른 이유는 많은 임베디드 함수 및 임베디드 유형의 메서드가 오브젝트를 변경하지만 변경된 오브젝트는 반환하지 않는다는 것입니다.수정된 오브젝트가 반환되면 기능 코드가 보다 깨끗하고 간결해집니다.예를 들어 some_list.append(some_object)가 some_list를 반환하고 some_object가 추가된 경우입니다.

다른 답변과 더불어 Python 및 기타 대부분의 멀티패러다임 언어가 진정한 기능 프로그래밍에 적합하지 않은 이유 중 하나는 해당 컴파일러/가상 머신/런타임에서 기능 최적화를 지원하지 않기 때문입니다.이러한 종류의 최적화는 컴파일러가 수학적 규칙을 이해함으로써 달성됩니다.예를 들어, 많은 프로그래밍 언어들이map기능 또는 방법.이것은 함수를 하나의 인수로, 두 번째 인수로 채택한 후 그 함수를 반복 가능한 각 요소에 적용하는 상당히 표준적인 함수입니다.

어쨌든 알고 보니map( foo() , x ) * map( foo(), y )와 같다map( foo(), x * y )후자의 경우는 후자가 1개의 복사본을 실행하는 경우 전자가 2개의 복사본을 수행하기 때문에 실제로 전자보다 빠르다.

보다 기능적인 언어는 이러한 수학적인 관계를 인식하고 자동으로 최적화를 수행합니다.기능 패러다임에 전념하지 않는 언어는 최적화되지 않을 수 있습니다.

언급URL : https://stackoverflow.com/questions/1017621/why-isnt-python-very-good-for-functional-programming

반응형