2013-10-13 7 views
5

하스켈의 순수한 함수가 클로저가 Functional Programming Is A Scam! by David Nolen에 언급 된 방식으로 변수의 로컬 복사본을 변형 할 수 있습니까? 그렇지 않은 경우 누군가가 나를 가리킬 수있는 예가 있습니까?Haskell의 순수한 함수가 변수의 로컬 복사본을 변형 할 수 있습니까?

유사한 질문이 Functions that look pure to callers but internally use mutation에 질문되었으며 일반적인 합의는 변수의 로컬 사본에서 돌연변이가 수행되는 한 순수한 기능이 돌연변이를 수행하는 것이 괜찮은 것으로 보였다 (즉, 돌연변이의 효과는 그 기능을 벗어나고 국부적이지 않은 영향을 줌). 내가 목록을 변이 않는, Bubblesort in Common Lisp에 거품 정렬에 공통 혀짤배기에, 목록을 변이 하지을 수행하고 비교 셴 (Local mutation, global mutation, mutable datastructures, Bubblesort in Qi)의 버블 정렬을 번역 할 때

질문

이 일어났다. 그 결과 (Common Lisp에서) 목록을 돌연변이시킨 버전이 목록을 변경하지 않은 버전보다 매우 큰 목록의 경우 훨씬 더 빠르다는 것을 알게되었습니다.

답변

11

ST 모나드는 순수 코드 내에서 변경 가능한 연산을 안전하게 포함하기위한 것입니다. 유형 시스템은 변경된 데이터가 범위를 벗어날 수 없도록 보장하기 위해 레버리지를 사용하므로 전체 프로그램을 상태를 유지할 위험없이 참조 가능한 투명성을 없애거나 경쟁 조건을 도입 할 수있는 위험없이 로컬 변경 가능 상태의 힘을 얻습니다.

ST는 모나드의 일부 문서 :

  • Haskell Wiki
  • ST to quick sort vectors (stack overflow)
  • +0

    감사합니다. "Haskell Wiki"의 sumST 예제는 순수한 함수가 지역 변이를 어떻게 사용할 수 있는지를 명확하게 보여줍니다. – artella