이것은 Haskell 및 quicksort에 관한 다른 질문과 밀접하게 관련되어 있습니다. 적어도 하스켈에 관한 책 소개을 읽을 필요가 있다고 생각합니다. 기존 변수의 값을 수정하지 못하도록하는 요점을 아직 파악하지 못한 것 같습니다.
스왑 (C++에서 이해하고 사용함)은 본질적으로 기존 값을 수정하는 것과 관련되어 있습니다. 이름을 사용하여 컨테이너를 참조하고 완전히 다른 내용으로 해당 컨테이너를 바꾸고 특정 컨테이너에 대해 신속하고 예외적이지 않도록 해당 작업을 전문화하여 수정 및 게시 방법을 구현할 수 있습니다 (예외 안전 코드 작성 또는 잠금 해제 코드 작성에 중요).
하스켈에서 일반적인 스왑을 작성할 수는 있지만 한 쌍의 값을 가져 와서 같은 값을 포함하는 새 쌍을 반대로 또는 그와 비슷한 값으로 반환합니다. 실제로는 똑같은 것이 아니며 동일한 용도로 사용되지 않습니다. 하스켈에서 그런 일을 할 수 없기 때문에 맵 내부를 파고 개별 구성원 변수를 바꿔 맵에 특화 시키려고 시도하는 것은 이치에 맞지 않을 것입니다 (당신은 전문화를 할 수는 있지만 할 수는 없습니다. 변수 수정).
우리가 "측정"하스켈 목록에 원 가정 :
유형 선언의
measure :: [a] -> Integer
. 즉, measure
함수는 아무 것도 나열하지 않고 (a
은 소문자로 시작하므로 generic 형식 매개 변수 임) Integer를 반환합니다. 그래서 이것은 어떤 엘레멘트 타입의리스트에 대해 작동합니다 - C++에서 함수 템플릿이라고 부르는 것이거나 하스켈에서 다형 함수로 불리는 것입니다 (C++의 다형성 클래스와 같지 않음).
우리는 지금 각 흥미있는 경우에 전문을 제공함으로써 그것을 정의 할 수 있습니다
measure [] = 0
즉 빈 목록을 측정하고 당신은 제로를 얻을.
measure (h:r) = 1 + measure r
좌변에 괄호 안의 비트 패턴입니다 :
여기에 다른 모든 경우를 커버하는 아주 일반적인 정의입니다. 즉, 목록을 작성하고 머리를 잘라 h라고 부르며 나머지 부분 r을 호출합니다. 그런 이름은 우리가 사용할 수있는 매개 변수입니다. 이것은 적어도 하나의 항목이있는 목록과 일치합니다.
C++에서 템플릿 메타 프로그래밍을 시도했다면 이것은 완전히 동일한 스타일을 포함하기 때문에 오래된 것입니다. 즉, 반복을 수행하는 재귀, 재귀를 종료하는 전문화가 포함됩니다. Haskell을 제외하고는 런타임에 작동합니다 (특정 값 또는 값 패턴에 대한 함수의 특수화).
이것은 농담입니다, 맞습니까? 이것은 어셈블리의 모든 것을 정확히 제어 할 수있는 방법을 묻는 것과 같습니다 : P – ShreevatsaR
어셈블리와 관련된 작업은 없습니다. 알고리즘 패밀리와 동일한 인터페이스를 유지하면됩니다. – obecalp
generic programming과 partial specialization (currying look up)에 관한 이상한 질문 외에도, "swapping variables"에 관한 질문은 이상합니다 : Haskell의 "두 상자의 내용 교환하기"와 같은 것이 없습니다. Haskell의 변수 데이터가있는 상자가 아닙니다. – ShreevatsaR