고차 함수는 함수형 프로그래밍에 더 강력한 기능을 제공합니까?


13

cstheory.SE에 대해 비슷한 질문 을했습니다 .

Stackoverflow 에 대한 이 답변에 따르면 비 게으른 순수 함수형 프로그래밍 언어에는 복잡도를 갖는 알고리즘이 있지만 명령형 프로그래밍의 동일한 알고리즘은 Ω ( n ) 입니다. FP 언어에 게으름을 추가하면 알고리즘이 Ω ( n )이 됩니다.Ω(nlogn)Ω(n)Ω(n)

고차 함수가 있거나없는 FP 언어를 비교하는 동등한 관계가 있습니까? 여전히 튜링 완료입니까? 그렇다면 FP에 고차가 없으면 언어가 덜 강력하거나 효율적이지 않습니까?


어떤 FP 언어?
reinierpost

고차 함수와 게으른 평가는 동일하지 않습니다. 그래서 당신의 질문은 무엇입니까?
Raphael

답변:


11

(데이터 유형 구현으로 예를 들어, 강력한 충분히 기능적인 프로그래밍 언어에서 클로저를 ) 당신의 변환에 의해 고차의 모든 사용을 제거 할 수 defunctionalization . 이 방법은 이러한 종류의 언어를 컴파일하는 데 사용되므로 성능에 영향을 미치지 않으며이 설정에서 높은 순서로 언어를 덜 강력하게 만들지 않는다고 합리적으로 가정 할 수 있습니다 . 그러나 코드 작성 방법에 영향을줍니다.

그러나 언어가 충분히 강력하지 않다면, 예를 들어, 높은 순서는 표현력을 제공합니다. 람다 미적분을 고려하십시오. 고차 함수가 없으면 가장 기본적인 데이터 유형 (정수, 부울)이 함수를 사용하여 구현되므로 실제로 아무것도 할 수 없습니다.

결론적으로 언어에 따라 다릅니다.


위의 대답입니다. 아래는 명령형 언어에 대한 일반적인 가정에 대한 의견입니다.

비 게으른 함수형 프로그래밍 언어에서 복잡도를 갖는 알고리즘에 관한 반면, 명령형 프로그래밍에서 동일한 알고리즘은 Ω ( n ) 입니다. FP 언어에 게으름을 추가하면 알고리즘이 Ω ( n )이 됩니다.Ω(nlogn)Ω(n)Ω(n)

이 참조를보고 싶습니다. 일반적인 가정은 RAM에서 길이 의 배열에 대한 액세스 는 시간 O ( 1 ) 이고 순수 FP의 동등한 시간은 시간 O ( log n )에 있다는 것 입니다. RAM의 액세스 시간은 O ( log m ) 이며 여기서 m 은 메모리 크기입니다. 물론, m n 입니다. 실제로 배열의 요소에 액세스하는 것이 훨씬 빠릅니다. 그 이유는 m 이 제한되어 있지만 ... n도 마찬가지입니다 !nO(1)O(logn)O(logm)mmnmn

O(1)


4

표현력의 의미에 따라 다릅니다.

고차가 무언가를 추가한다는 주장은 다음과 같습니다. 1 차 언어의 경우, 원시 재귀는 Ackermann 함수 를 표현하기에 충분하지 않습니다 . 그러나 고차 함수가있는 경우 기본 재귀로 충분합니다.

Ackermann 0=λx.x+1Ackermann (m+1)=Iter (Ackermann m)Iter f 0=f 1Iter f (n+1)=f (Iter f n)

이것은 원시 재귀 만 사용하여 Ackermann 함수를 정의합니다.

IterIterNkNkIter(NN)(NN)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.