15

처음에 저는 하스켈 초보자입니다. 나는 이것을 읽었습니다 : Immutable functional objects in highly mutable domain 그리고 제 질문은 거의 똑같습니다 - 국가가 바뀌어야하는 알고리즘을 효율적으로 작성하는 방법. Dijkstra의 알고리즘을 예로 들어 봅시다. 새로운 경로가 발견되고 거리가 업데이트되어야합니다. 그리고 전통적인 언어에서 이것은 단순합니다. 예를 들어 Haskell에서 나는 너무 느리고 메모리를 소비하는 완전히 새로운 거리를 만드는 것에 대해서만 생각할 수 있습니다. 변경 가능한 데이터 구조를 가진 알고리즘을 구현해야하는 경우와 속도와 메모리 사용과 관련된 디자인 패턴과 같은 것이 주요 관심사입니까?기능 프로그래밍에서의 변이 가능성

답변

19

물론 기능 언어가이 문제를 해결하는 데는 여러 가지 방법이 있습니다.

  1. 다른 데이터 구조 - 많은 데이터 구조가 필수적 버전과 동일한 알고리즘의 복잡성과 더불어, 순수하게 기능 방식으로 구현 될 수있다. 아마도이 분야에서 가장 잘 알려진 작품은 Chris Okasaki의 Purely Functional Data Structures이지만 다른 많은 자료도 있습니다. Dijkstra 알고리즘의 경우 Martin Erwig 님의 작업이 functional graphs에 적합합니다. this question도 참조하십시오.

  2. 다른 알고리즘 - 일부 알고리즘에는 변경 가능성에 대한 가정이 있지만 Quicksort가 이에 해당합니다. 이 경우 불변성에 더 잘 적응할 수있는 대체 알고리즘을 사용할 수 있습니다.

  3. 가변 상태 - 모든 기능 언어는 상태 모나드로 기능 상태를 모델링 할 수 있습니다. 대부분은 Haskell의 ST 모나드와 IORef 같은 다른 형태의 변경도 제공합니다.

+5

슬프게도, 지연된 기능 불변 언어에 가장 적합한 데이터 구조 및 알고리즘에 대한 연구는 엄격한 명령형 언어에 비해 뒤떨어져 있습니다. :-( – ephemient

6

ST Monad은 내부적으로 가변 상태를 사용할 수 있지만 순수 외부 인터페이스를 제공합니다.

6

새로운 불변 ​​객체를 만드는 것은 컴파일러가 변경할 수 없으므로 안전하게 공유 할 수 있기 때문에 많은 양의 구조적 공유가 발생할 수 있기 때문에 생각만큼 비용이 들지 않습니다. 즉, 하스켈에서 가변적 인 상태를 많이 가진 매우 긴급한 알고리즘을 사용하면 약간의 코드 냄새가 난다고합니다.

1

ML 파생물 (예 : OCaml, SML, F #)에서는 "참조"가 가변 변수로 사용될 수 있습니다.

하스켈에서는이 문제가 깔끔하게 처리되지 않습니다. 국가는 단순히 "순전히 기능적인"스타일로 다루어지지 않습니다. 순수 FP 언어는 "영원한 진리"를 다루므로 "일시적인 진리"(확실히 끝낼 수는 있지만)와 일하는 데는 적합하지 않습니다.

그러나 예, 가끔 가변 상태가 필요합니다. ATS과 같은 언어는 파괴적인 업데이트 및 안전한 리소스 조작을 처리하기 위해 linear 유형을 통합합니다.