2016-10-20 4 views
2

저는 일반적으로 Clojure와 함수 프로그래밍을 배우고 있습니다 (Python에서 제공). Clojure에서는 slurp 및 다른 입력 방법을 사용할 수 있으므로 불순한 기능을 만들 수 있습니다. Clojure에서 불순한 기능을 쉽게 식별 할 수있는 방법이 있습니까? 아니면 코드의 별도 섹션에 이러한 기능을 유지하는 연습입니까?Clojure에서 불순한 함수를 확인하십시오.

+2

아니요. 어떻게하면 "불순한 기능"을 정의하겠습니까? ['memoize'] (https://clojuredocs.org/clojure.core/memoize) 불순한가요? 'memoize' 함수가 리턴 한 함수는 무엇입니까? 또는 내부적으로 [transients] (http://clojure.org/reference/transients)를 사용하는 참조 기능이있는 투명 함수? –

+2

Clojure는 순수한 FP 언어가 아닙니다 (예 : Haskell). 이것이 당신에게 중요하다면, Clojure는 올바른 선택이 아닙니다. –

+0

@MichielBorkent : 순수하다는 것은 나에게 중요하지 않다. 순수하고 불순한 부분을 분리 할 수 ​​있다면 흥미로울 것이라고 생각했다. – RFVenter

답변

1

이론적으로 함수가 부작용을 일으키는 지 여부를 식별 할 수있는 방법이 없습니다 (라이스의 정리로 인해). 따라서 순수 함수와 불순한 함수를 구분하는 것은 불가능합니다. 물론, 구문 수준에서 함수가 확실히 불투명한지 여부를 확인하는 방법이있을 수 있지만, 실제로 이것이 실제로 도움이 될지는 의문입니다.

0

STM 트랜잭션 내에서 사용하기에 안전하지 않은 뱅 (예 : swap!)이있는 함수 이름을 끝내는 데 꽤 일반적인 convention이 있습니다. 여기에는 입출력 및 여러 가지 유형의 부작용이 포함되어 있으므로 불순물과 중복되는 부분이 있지만 대부분의 불완전한 기능도 전적으로 안전합니다.

+0

스왑은 STM의 일부이기 때문에 "STM 내에서 사용하기에 안전하지 않다"는 말을 되풀이하십시오 ;-) 그것은 완전히 안전합니다. 단지 부작용을 제어했습니다. –

+0

@ArthurUlfeldt 문구는 이미 도서관 코드 표준의 구문과 매우 비슷합니다. "STM 트랜잭션에서 안전하지 않은 것들에만 강타하십시오!" 그래서 나는 그것을 어떻게 개선 할 수 있을지 확신하지 못한다. –

+0

"dosync"블록에서'swap! '을 사용하는 것을 피하는 사람들이 실제로는 안전하지 않다고 생각하기 때문에 사람들이보고 싶지 않습니다. 우리는 그런 소문을 시작하는 이것 같이 위치에 계산서를 남겨두기에 조심해야한다. STM 내부에서 실제로 사용하기에 안전하지 않은 예제를 선택할 수 있습니다. 그러나 이름이 끝나는 모든 함수의 경우에는 해당하지 않습니다. –

관련 문제