일급 기능과 고차 기능의 차이점


답변:


154

차이가 있습니다. 언어에 일급 함수가 있다고 말하면 언어가 함수를 값으로 취급한다는 것을 의미합니다. 함수를 변수에 할당하고 전달할 수 있습니다. 상위 함수는 다른 함수에서 작동하는 함수입니다. 하나 이상의 함수를 인수로 사용하고 함수를 리턴 할 수도 있습니다.

"고차"개념은 수학적 의미의 함수와 같은 일반적인 함수에 적용될 수 있습니다. "일류"개념은 프로그래밍 언어의 함수와 만 관련이 있습니다. “일류 함수”와 같은 함수를 언급 할 때는 거의 사용되지 않습니다. “언어가 일급 기능을 지원하지 않았거나하지 않았다”고 말하는 것이 훨씬 일반적입니다.

고차 함수를 지원하지 않는 일급 함수를 사용하는 언어와 반대로 고차 함수를 사용하지만 일류 함수를 지원하지 않는 언어는 상상하기 어렵 기 때문에 두 가지가 밀접하게 관련되어 있습니다.


2
나는 쉽게 혼란스러워하는 것은 그들이 밀접하게 관련되어 있다는 것입니다.
Simon

63
@Simon 혼란을 피하는 열쇠는 언어가 일급 함수를 가지고 있거나 (일류 클래스와 같은 다른 것들에 대해 "일류"에 대해 이야기 할 수 있음) 기억하지 않는 것입니다. 따라서 특정 기능 이 일류인지 아닌지 이야기 하지 마십시오. OTOH는 함수가 고차인지 아닌지를 말하면 함수에서 작동하는지 여부 만 알려주므로 "고차 수"는 각 개별 함수의 속성입니다. 따라서 "일류 함수를 가짐"은 언어의 속성이며 "고차"는 함수의 속성입니다.
Ben

정확히 벤. 나는 그 두 가지가 모두 기능의 속성이라고 생각했기 때문에 혼란 스러웠습니다. 귀하의 의견에 감사드립니다.
Simon

또한 "일류 함수"는 클로저 지원과 동일하지 않다는 점을 명심하십시오. 예를 들어 C에서는 함수 포인터를 통해 "일류 함수"를 지원합니다. 그러나 C는 중첩 함수 개념을 지원하지 않으므로 클로저를 지원하지 않습니다.
Tac-Tics

1
@ Tac-Tics 정의는 확실히 주관적이고 논쟁의 여지가 있지만 개인적으로 C는 (함수 포인터를 통해) 고차 함수 만 지원한다고 생각합니다. 함수는 다른 값과 같은 유형의 열등하기 때문에, 일류 기능은 지원되지 않습니다 int또는 char그들이 할 수 없다는 점에서, 명시 적으로 당신이 원하는 목적지 (함수 기관) 정의.
wlnirvana

67

퍼스트 클래스 함수 는 객체처럼 취급되거나 변수에 할당 가능한 함수입니다.

고차 함수 는 하나 이상의 첫 번째 클래스 함수를 매개 변수로 사용하거나 하나 이상의 첫 번째 클래스 함수를 리턴하는 함수입니다.


20

그들은 다릅니다.

퍼스트 클래스 기능

전체적으로 균일하게 처리되는 언어의 값을 "퍼스트 클래스"라고합니다. 그것들은 데이터 구조에 저장되거나 인수로 전달되거나 제어 구조에 사용될 수 있습니다.

함수 유형으로 값을 지원하고 비 기능 값과 동일하게 취급하는 언어는 "일등 함수"라고 할 수 있습니다.

고차 함수

퍼스트 클래스 함수를 갖는 결과 중 하나는 함수를 다른 함수에 인수로 전달할 수 있어야한다는 것입니다. 후자의 기능은 이제 "고차"입니다. 함수를 인수로 취하는 함수입니다.

일반적인 예는 "지도"입니다

map :: (a -> b) -> [a] -> [b]
map f []     = []
map f (x:xs) = f x : map f xs

즉, 함수와 배열을 가져와 각 요소에 함수가 적용된 새 배열을 반환합니다.

기능적 언어 (기능이 프로그램을 구축하는 주요 수단 인 언어)에는 모두 일급 기능이 있습니다. 대부분의 경우 고차 함수가 있습니다 (예를 들어 Excel과 같은 언어는 매우 드물지만 예외적으로 작동하지만 고차는 아닙니다).


1
고마워 돈. 포괄적입니다. 그리고 "결과 중 하나"라는 단계는 그 둘 사이의 관계를 나타냅니다.
Simon

10

이전 답변 외에도 일급 함수가있는 언어는 자동으로 고차 함수를 표현할 수 있습니다 (다른 값처럼 함수를 매개 변수로 전달할 수 있기 때문에).

반면에, 고차 함수를 지원하지만, 함수를 일급으로하지 않는 함수 (및 함수 인 매개 변수가 특수하게 처리되고 "일반적인"값 매개 변수와 다른 경우)는 상상할 수 없습니다.

따라서 (언어 기능으로서) 일급 함수의 존재는 고차 함수의 존재를 의미하지만 다른 방법은 아닙니다.


고차 함수가 일급 함수가 아닌 예를 들어 줄 수 있습니까? (둘 다 동일하다고 생각했습니다.)
ATHER

@ATHER, 나는 기능에 대해 그러한 디자인을 선택할 언어의 구체적인 예를 가지고 있지 않습니다. 그러나 C ++의 템플릿의 경우와 비슷한 경우가 있습니다. 템플릿은 높은 순서 ( "템플릿 템플릿 매개 변수"를 가질 수 있음)이지만 첫 번째 클래스 값은 아닙니다. 즉 템플릿은 일반 함수의 매개 변수가 될 수 없습니다. ML의 모듈 / 펑터와 유사합니다.
Andreas Rossberg

@AndreasRossberg Java 8이 그의 질문에 대한 올바른 답변이 아니겠습니까? 함수는 일류 시민이 아니지만 Java 함수는 "함수가 특수하게 처리되고"일반 "값 매개 변수와 다른 매개 변수"로 설명 된대로 기능 인터페이스를 통해 함수를 수신 할 수 있습니다.
Abdul

1

일등석 기능은 다음과 같습니다.

  • 변수에 저장
  • 함수에서 반환됩니다.
  • 다른 함수에 인수로 전달하십시오.

고차 함수 는 다른 함수를 반환하는 함수입니다.

예를 들면 다음과 같습니다.

function highOrderFunc() {
  return function () {
    alert('hello');
  };
}

0

일급 함수는 다른 유형 (변수, 부울, 숫자 ...)으로 수행 할 수있는 모든 것을 의미하며 함수로 수행 할 수 있습니다.

예를 들어 변수에 변수를 할당하고, 전달하고, 즉시 작성하십시오.

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