대부분의 기능적 언어는 링크 된 목록을 기본 불변 데이터 구조로 사용합니다. 왜 나무가 아닌리스트인가? 트리는 경로와 모델 목록도 재사용 할 수 있습니다.
대부분의 기능적 언어는 링크 된 목록을 기본 불변 데이터 구조로 사용합니다. 왜 나무가 아닌리스트인가? 트리는 경로와 모델 목록도 재사용 할 수 있습니다.
답변:
목록은 나무보다 단순하기 때문입니다. (리스트는 모든 노드가 하나의 자식만을 갖는 퇴화 트리라는 사실에 의해 간단하게 볼 수 있습니다.)
단점 목록은 임의의 크기의 가장 간단한 재귀 데이터 구조입니다.
Guy Steele은 Fortress 프로그래밍 언어를 설계하는 동안 미래의 대규모 병렬 계산을 위해 데이터 구조와 제어 흐름이 현재와 같이 선형이 아닌 여러 가지로 트리 모양이어야한다고 주장했습니다. 그러나 당분간 대부분의 핵심 데이터 구조 라이브러리는 병렬 처리가 아닌 순차적 반복 처리 (또는 꼬리 재귀, 실제로는 중요하지 않음)를 염두에두고 설계되었습니다.
참고 예를 들어 누구의 데이터 구조를 특별히 설계되었다 Clojure의에 대한 오늘날의 "흐린"세계, 심지어 배열 (Clojure의 호출 벡터), 아마 그들 모두의 데이터 구조 "선형"가장이되어 분산 병렬, 실제로 으로 구현 나무.
요약하자면, 단점 목록은 가능한 가장 간단한 영구 재귀 데이터 구조이며 더 복잡한 "기본"을 선택할 필요가 없습니다. Haskell에는 배열, 우선 순위 대기열, 맵, 힙, 가두기, 시도 및 상상할 수있는 모든 것이 있지만 옵션은 옵션으로 사용할 수 있지만 기본값은 간단한 단점 목록입니다.
data Tree a = Leaf a | Branch a (Tree a) (Tree a)
. 이것은 당신의 "단순성"주장을 강화합니다.
Sequence
또는 Scala Vector
) 를 원할 때 동일한 선택 (때로는 다른 종류의 나무가 있음)을 선택 하지만 실제 일정한 시간에 달성 할 수 있으므로 읽기만하면 트리를 사용하지 않습니다 (예 : Vector
.Net을 통한 Haskell 또는 F # ImmutableArray
)
pmap
Clojure의 벡터를 ping하면 여전히 각 요소에 순차적으로 액세스합니다. 벡터의 트리 구조는 일반적으로 최종 사용자로부터 숨겨집니다.
사실, 그 목록 은 나무입니다! 당신은 두 개의 필드와 노드가, car
그리고 cdr
더 같은 노드, 또는 잎을 포함 할 수있는. 이러한 트리를 목록으로 만드는 유일한 것은 링크를 선형 목록의 다음 노드에 대한 링크로 해석 하고 cdr
링크를 car
현재 노드의 값으로 해석 하는 규칙 입니다.
즉, 함수형 프로그래밍에서 링크 된 목록의 유병률은 반복에 대한 재귀의 유병률과 관련이 있다고 생각합니다. 현재 유일하게 반복되는 구조가 (꼬리) 재귀 인 경우,이를 사용하기 쉬운 데이터 구조가 필요합니다. 그리고 링크 된리스트는 그에 완벽합니다.