code

순전히 기능적인 데이터 구조의 이점은 무엇입니까?

codestyles 2020. 12. 29. 07:06
반응형

순전히 기능적인 데이터 구조의 이점은 무엇입니까?


데이터 구조에 대한 많은 텍스트와 데이터 구조 코드 라이브러리가 있습니다. 순전히 기능적인 데이터 구조가 추론하기 쉽다는 것을 이해합니다. 그러나 명령 적 대응 물에 비해 실용적인 코드에서 순수하게 기능적인 데이터 구조를 사용하는 실제 세계 이점을 이해하는 데 어려움이 있습니다. 누군가가 순전히 기능적인 데이터 구조가 이점이있는 실제 사례를 제공 할 수 있으며 그 이유는 무엇입니까?

선을 따라 예를 들면 내가 사용하는 같은 data_structure_name을programming_language응용 프로그램 이 할 수 있기 때문에 certain_thing을 .

감사.

추신 : 순전히 기능적인 데이터 구조가 의미하는 것은 영구 데이터 구조와 동일하지 않습니다. 영구 데이터 구조는 변경되지 않는 데이터 구조입니까 ?? 반면에 순전히 기능적인 데이터 구조는 순전히 작동하는 데이터 구조입니다.


순전히 기능적 (일명 영구 또는 불변) 데이터 구조는 다음과 같은 몇 가지 이점을 제공합니다.

  • 잠글 필요가 없으므로 동시성 이 크게 향상 됩니다 .
  • 구조를 공유 하여 메모리 사용량줄일 수 있습니다 . 예를 들어, Haskell의 목록 [1, 2, 3, 4]와 Java와 같은 명령형 언어를 고려하십시오. Haskell에서 새 목록을 생성하려면 새 목록 cons(값 쌍과 다음 요소 참조)을 만들고 이전 목록에 연결하기 만하면됩니다. Java에서는 이전 목록을 손상시키지 않도록 완전히 새로운 목록을 만들어야합니다.
  • 영구 데이터 구조를 게으르게 만들 수 있습니다 .
  • 또한 기능적 스타일을 사용하면 시간과 작업 순서에 대한 생각을 피할있으므로 프로그램을 더 선언적으로 만들 수 있습니다 .
  • 사실, 데이터 구조는 불변이므로 더 많은 가정을 할 수 있으므로 언어의 기능을 확장 할 수 있습니다 . 예를 들어, Clojure 는 불변성 사실을 사용하여 각 객체에 hashCode () 메서드의 구현을 올바르게 제공하므로 모든 객체를 맵에서 키로 사용할 수 있습니다.
  • 변경 불가능한 데이터와 기능적 스타일로 메모 화를 자유롭게 사용할 수 있습니다 .

일반적으로 실제 세계를 모델링하는 또 다른 방법입니다. 장과 SICP의 다른 장에서는 변경 불가능한 구조, 장점 및 단점을 사용한 프로그래밍에 대한보다 정확한보기를 제공합니다.


공유 메모리 안전성 외에도 대부분의 순수 함수 데이터 구조는 지속성 을 제공하며 사실상 무료입니다. 예를 들어, setOCaml에 a가 있고 여기 에 몇 가지 새로운 값을 추가하고 싶다고 가정 해 보겠습니다 .

module CharSet = Set.Make(Char)
let a = List.fold_right CharSet.add ['a';'b';'c';'d'] CharSet.empty in
let b = List.fold_right CharSet.add ['e';'f';'g';'h'] a in
...

a새 문자를 추가 한 후에도 수정되지 않은 상태로 유지되고 (광고 만 포함됨) bah가 포함되어 있으며 동일한 메모리의 일부를 set공유합니다 (AVL 트리이기 때문에 공유되는 메모리 양을 알려주 것이 다소 까다 롭습니다. 트리 변경). 이 작업을 계속하여 트리에 대한 모든 변경 사항을 추적하여 이전 상태로 돌아갈 수 있습니다.

다음 은 이진 트리에 문자 'e'를 삽입 한 결과를 보여주는 Purely Functional에 대한 Wikipedia 기사 의 훌륭한 다이어그램 입니다 xs.

대체 텍스트


Erlang 프로그램은 순전히 기능적인 데이터 구조를 거의 독점적으로 사용하며 거의 원활하게 여러 코어로 확장하여 상당한 이점을 얻습니다. 공유 데이터 (주로 바이너리 및 비트 문자열)는 수정되지 않기 때문에 이러한 데이터를 잠글 필요가 없습니다.


이 작은 F # 스 니펫을 가져옵니다.

let numbers = [1; 2; 3; 4; 5]

100 % 확실하게 1에서 5까지의 정수 목록을 변경할 수 없다고 말할 수 있습니다. 해당 목록에 대한 참조를 전달할 수 있으며 목록이 수정되었을 수 있다고 걱정할 필요가 없습니다. 그것은 내가 그것을 사용하기에 충분한 이유입니다.


순수하게 기능하는 데이터 구조에는 다음과 같은 장점이 있습니다.

  • 지속성 : 이전 버전은 변경할 수 없다는 사실을 알고 안전하게 재사용 할 수 있습니다.

  • 공유 : 데이터 구조의 여러 버전을 적당한 메모리 요구 사항만으로 동시에 유지할 수 있습니다.

  • 스레드 안전성 : 모든 변형은 게으른 썽크 (있는 경우) 내부에 숨겨져 있으므로 언어 ​​구현에 의해 처리됩니다.

  • 단순성 : 상태 변경을 추적 할 필요가 없으므로 순전히 기능적인 데이터 구조를 사용하기가 더 간단 해지며, 특히 동시성 컨텍스트에서 더욱 그렇습니다.

  • 증분 성 : 순전히 기능적인 데이터 구조는 많은 작은 부분으로 구성되어있어 지연 시간을 줄이는 증분 가비지 수집에 이상적입니다.

필자는 이것이 사실이라고 믿지 않기 때문에 순전히 기능적인 데이터 구조의 이점으로 병렬 처리를 나열하지 않았습니다. 효율적인 멀티 코어 병렬 처리는 캐시를 활용하고 주 메모리에 대한 공유 액세스에 병목 현상이 발생하지 않도록 예측 가능한 지역성을 필요로하며 순수하게 기능하는 데이터 구조는 이와 관련하여 기껏해야 알려지지 않은 특성을 가지고 있습니다. 결과적으로 순전히 기능적인 데이터 구조를 사용하는 많은 프로그램은 공유 메모리 경로를 놓고 경쟁하면서 캐시 미스에 모든 시간을 소비하기 때문에 멀티 코어에서 병렬화 할 때 제대로 확장되지 않습니다.

순전히 기능적인 데이터 구조가 의미하는 것은 영구 데이터 구조와 동일하지 않습니다.

여기에 약간의 혼란이 있습니다. 순전히 기능적인 데이터 구조의 맥락에서 지속성은 데이터 구조의 이전 버전이 여전히 유효하다는 것을 알고 안전하게 다시 참조 할 수있는 기능을 나타내는 데 사용되는 용어입니다. 이것은 순전히 기능적이라는 자연스러운 결과이므로 지속성은 순전히 기능하는 모든 데이터 구조의 내재적 특성입니다.

참조 URL : https://stackoverflow.com/questions/4399837/what-is-the-benefit-of-purely-functional-data-structure

반응형