Haskell에서 그래프를 만들고 일부 로컬 작업을 수행하는 방법을 배우고 싶지만 Haskell에만 국한된 문제는 아니며 그래프 대신 이중 연결 목록을 고려할 수 있습니다.
질문 : 이중 연결 목록 (또는 다른 이중 연결 또는 순환 데이터 구조)과 불변 데이터 구조 (Haskell, Clojure 등)를 주로지지하고 옹호하는 언어로 작업을 수행하는 관용적이거나 권장되는 방법은 무엇입니까 ? ? 특히 언어에서 공식적으로 금지하는 전체 업데이트를 사용하는 방법은 무엇입니까?
예를 들어 항목이 삽입 된 경우와 같이 이중 연결 목록에서 일부 로컬 작업을 수행하는 경우 언어의 게으름으로 인해 전체 목록을 즉시 복사 할 필요가 없을 수 있습니다. 그러나 목록이 이중으로 연결되어 있기 때문에 한 곳에서 수정하면 새 버전의 목록에서 이전 노드를 사용할 수 없으며 조만간 표시, 복사, 가비지 수집이 필요합니다. . 업데이트 된 목록의 복사본 만 사용해야하는 경우에는 중복 작업이지만 목록의 크기에 비례하여 "오버 헤드"가 추가됩니다.
이것은 그러한 작업에 대해 불변 데이터가 단순히 부적절하고, 가변 데이터에 대한 "네이티브"지원이없는 기능적 선언적 언어가 명령형 언어만큼 좋지 않다는 것을 의미합니까? 아니면 까다로운 해결 방법이 있습니까?
추신 : 나는이 주제에 관한 기사와 프리젠 테이션을 인터넷에서 찾았지만 그 뒤를 따라가는 데 어려움을 겪었지만이 질문에 대한 답은 한 단락 이상이 아닌 다이어그램을 취해서는 안된다고 생각합니다 ... 이 문제에 대한 "기능적"솔루션이 없다면 아마도 "use C"일 것입니다. 하나가 있다면 얼마나 복잡 할 수 있습니까?
관련 질문
"함수형 프로그래밍의 데이터 구조" . 비효율적 인 대안 대신 전체 업데이트 사용에 대한 나의 구체적인 질문은 여기서 논의되지 않습니다.
"영구 데이터 구조의 내부 돌연변이" . 지정되지 않은 언어로 저수준 구현에 중점을두고있는 반면, 내 질문은 언어 (기능적 또는 다른)의 올바른 선택과 기능적 언어의 가능한 관용적 솔루션에 관한 것입니다.
관련 인용
순전히 기능적인 프로그래밍 언어를 사용하면 많은 알고리즘을 매우 간결하게 표현할 수 있지만 업데이트 가능한 상태가 중요한 역할을하는 알고리즘이 몇 가지 있습니다. 이러한 알고리즘의 경우 업데이트 가능한 상태가없는 순수한 기능 언어는 본질적으로 비효율적 인 것으로 보입니다 ( [Ponder, McGeer and Ng, 1988] ).
-John Launchbury 및 Simon Peyton Jones, Lazy 기능 상태 스레드 (1994), John Launchbury 및 Simon Peyton Jones, Haskell 주 (1995). 이 논문 ST
은 하스켈에서 모나 딕 타입 생성자를 소개 합니다.
Map
, IntMap
또는 HashMap
스토리지로)와 노드가 링크 노드의 ID를 포함 할 수 있습니다. "컴퓨터 과학의 모든 문제는 다른 수준의 간접 지시로 해결할 수 있습니다."