2014-02-17 3 views
8

algo.monadsfluokitten 설명서를 살펴 보았습니다. 또한 모나드 블로그 항목을 Jim Duey, Konrad HinsenLeonardo Borges까지 읽었습니다.Clojure의 Haskell에서 IO Monad를 할 수 있습니까?

내가 찾을 수있는 가장 가까운 Konrad Hinsen's library Monadic IO streams -하지만이

oneST :: ST s Int -- note that this works correctly for any s 
oneST = do var <- newSTRef 0 
      modifySTRef var (+1) 
      readSTRef var 

one :: Int 
one = runST oneST 
하스켈

에서 ST를 사용하는 예입니다 (더 나은 말씨의 결핍) '모나드 인터페이스를 구현'에 표시되지 않습니다

내 질문 : Clojure에서 IO Monad from Haskell 할 수 있습니까? 예제를 제공해 주시겠습니까?

+0

Clojure는 동적 유형 지정 언어가 아닙니까? IO 나 ST와 같은 모나드의 이점은 무엇이겠습니까? 불법적 인 조작에 대한 예외를 던집니까?이 방법은 나중에 프로그램 흐름에서 불법적 인 작업의 영향에 대처하는 것보다 낫습니다. – ziggystar

+3

Clojure에서 재사용하고 싶은 하스켈의 'IO'의 특징은 무엇입니까? –

+5

예, 가능합니다. – augustss

답변

14

이 질문에 대답하는 데는 몇 가지 방법이 있습니다.

예 하찮게

  • : 부작용 작업의 특별한 권한을 부여하는 모나드 변압기 등의 IO의 생각합니다. 그런 다음 Clojure의 모나드는 IO 모나드입니다. 부작용은 Clojure에서 권한이 부여 된 작업이 아니기 때문입니다.

  • 멍청 : Clojure의 튜링 - 완료, 그래서 당신은 Clojure에서의 IO 모나드 포함 하스켈을 모두 구현할 수있다. Haskell은 Turing-complete이므로 Haskell에서 Clojure를 모두 구현하고 IO 모나드를 노출 할 수 있습니다.

없음

  • 철학적

    :
    타입 시스템과 통합하면서 순도를 보존 IO 모나드의 본질, Clojure에서의 불순물 및 동적 입력과 호환되지 않습니다. IO 모나드에 구h 구두를 신는 시도는 Clojure의 철학과 상충되거나 IO 모나드를 갖는 본질적인 점을 포착하지 못합니다.

은 어쩌면

  • 일부 : 질문에 연결된 모나드-IO 스트림 라이브러리는 algo.monads 라이브러리 또는 그 이전에 사용하기위한 것입니다. 모나드 인터페이스는 모나드입니다. Monadic-IO 스트림은 IO와 함께 작동하도록 IO 기능을 제공합니다. 이것은 부작용이있는 다른 함수를 사용하는 것을 방해하지 않으며, IO를 통합하는 유형 시스템이 없으면 어떤 체계적인 방법인지는 말할 수 없습니다. 이것은 IO 모나드가 아닙니다. IO 모나드와 비슷한 점이 있습니다. 이것은 흥미롭지 만 불확실한 유틸리티입니다.

  • 언젠가 :Typed Clojure에 관심이 있습니다. 부작용이 유형 시스템에 추가되는 경우, 일부 목적을 위해 구조화 된 방식으로 이들을 분리하고 유형 지정 Clojure에 IO 모나드 같은 것이 존재하는 이유를 부여하는 것이 바람직 할 수 있습니다.