함수형 프로그래밍의 데이터 구조


11

나는 현재 LISP (특히 Scheme and Clojure)를 가지고 놀고 있으며 기능적인 프로그래밍 언어에서 전형적인 데이터 구조가 어떻게 처리되는지 궁금합니다.

예를 들어 그래프 경로 찾기 알고리즘을 사용하여 문제를 해결하고 싶다고 가정 해 봅시다. 함수형 프로그래밍 언어로 주로 그래프를 표현하는 방법은 무엇입니까 (주로 LISP에 적용 할 수있는 순수한 기능 스타일에 관심이 있습니까)? 그래프를 잊어 버리고 다른 방법으로 문제를 해결할 수 있습니까?

답변:


14

LISP에서 일한 지 얼마되지 않았지만, 아시다시피, 기본 비 원자 구조는 목록입니다. 그 밖의 모든 것은이를 기반으로합니다. 따라서 각 원자가 노드 인 원자 목록과 노드를 다른 노드에 연결하는 모서리 목록이있을 수 있습니다. 다른 방법도 있다고 확신합니다.

아마도 이런 식으로 뭔가 :

(
  (a (b c)),
  (b (a c)),
  (c (a b d)),
  (d (c))
)

다음과 같은 그래프를 줄 수 있습니다.

a <-> b <-> c <-> d
^ ^
| |
+ --------- +

화려하고 싶다면 가중치도 추가 할 수 있습니다.

(
  (a (b 1.0 c 2.0)),
  (b (a 1.0 c 1.0)),
  (c (a 1.3 b 7.2 d 10.5)),
  (d (c -10.5))
)

당신이에 관심이있을 수 : CL-그래프 (구글 - 검색 문구를 "혀짤배기 그래프 구조"에 의해 발견)


4
조금 늦었지만 "다른 모든 것은 [목록]을 기반으로합니다"라는 말이 잘못되었다고 경고해야한다고 생각합니다. 공통 Lisp, Scheme 및 Clojure에는 모두 벡터, 맵, 문자열 및 구조 / 클래스가 있으며 목록 위에 구축되지 않습니다. 코드 우리는 일반적으로 새로 만들 물품리스트는, 예를 들면 (메이크업 배열 '(2)의 초기 요소 0)이지만, 데이터 구조는리스트를 이용하여 구현되지 않는다.
coredump 2018 년

3

기능적 언어는 비 기능적 언어와 동일한 방식으로 데이터 구조를 처리합니다. 인터페이스를 구현에서 분리하고 추상 데이터 유형을 생성합니다.

Lisp에서 추상 데이터 유형을 작성할 수 있습니다. 예를 들어, 그래프의 경우 몇 가지 함수를 원할 수 있습니다.

(define (get-vertices graph) ;; gets all the vertices from a graph
  ...)

(define (get-edges graph) ;; gets all the edges from a graph
  ...)

(define (get-weight vertex-from vertex-to) ;; get the weight of a specific vertex
  ...)

해당 인터페이스를 그래프에 작성하면 실제 데이터 구조를 여러 가지 방법으로 구현하여 프로그래머 효율성, 유연성 및 계산 효율성과 같은 요소를 최적화 할 수 있습니다.

핵심은 그래프를 사용하는 코드가 그래프 인터페이스 사용하고 기본 구현에 액세스하지 않는지 확인하는 것입니다. 이렇게하면 클라이언트 코드가 실제 구현과 분리되어 클라이언트 코드가 더 단순 해집니다.


2

글쎄, 그것은 그래프가 지시 / 비 방향, 가중 / 비가 중인지 여부에 달려 있지만 (가장 일반적 일 것입니다) 지시, 가중 그래프를 나타내는 한 가지 방법은 Clojure의지도 맵입니다

{
 :a {:b 3 :c 4} 
 :b {:a 1} 
 :c {}
}

: a : b 및 : c 노드가있는 맵을 나타냅니다. : a는 무게가 3 인 : b를 가리키고 : c는 무게가 4 인 것을 가리 킵니다. : b는 무게가 1 인 : a를 가리 킵니다. : c는 아무 것도 가리 키지 않습니다.


1

Common Lisp에서 트리를 표현 해야하는 경우 목록을 사용하거나 (빠른 해킹 인 경우) 트리 클래스를 정의하거나 구조체를 정의하지만 클래스는 일반 함수와 잘 상호 작용하므로 왜 그렇지 않습니까? .

(defclass tree ()
  ((node :accessor node :initarg :node)
   (children :accessor children :initarg :children)))

코드에 리터럴 트리가 필요한 경우 make-tree원하는 트리의 목록 표현을 사용하여 트리 객체 트리로 변환하는 함수를 정의 할 수도 있습니다.


-2

Haskell에서 목록은 기본 데이터 구조이며 고급 데이터 구조를 원할 경우 종종 트리가 null이거나 노드 및 2 개의 나무와 같은 재귀 구조를 사용합니다.

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