2014-07-17 2 views
1

쿼리에서 시퀀스 모나드 주위에 머리를 감싸려고합니다. 클로저에있는 시퀀스 모나드 쿼리

(use 'clojure.algo.monads) 

(def sequence-monad-decider 
    (fn [step-value monadic-continuation] 
     (mapcat monadic-continuation step-value))) 

(def sequence-monad-monadifier list) 

(def sequence-monad 
    (monad [m-result sequence-monad-monadifier 
      m-bind sequence-monad-decider])) 

(prn 
(with-monad sequence-monad 
    (domonad [a [1 2] 
      b [10, 100] 
      c [-1 1]] 
      (* a b c)))) 

그래서 I은 m-바인드 스텝 값 sequence-monad-decider로 연속 전달하는 데 사용된다는 것을 이해한다

난 clojure.algo.monads을 사용하는 시퀀스 모나드를 생성 코드를 갖는다.

sequence.monad-decider이 다음과 같이 정의된다 : 위의 a 제본

(prn 
(with-monad sequence-monad 
    (domonad [a [1 2] 
      b [10, 100] 
      c [-1 1]] 
      (* a b c)))) 

, [1 2]sequence.monad.decider의 단계 값으로 전달된다 : 우리는 모나드 호출 보면

(def sequence-monad-decider 
    (fn [step-value monadic-continuation] 
     (mapcat monadic-continuation step-value))) 

을 이 함수의 두 번째 인수로 전달되는 monadic-continuation 함수는 무엇입니까? sequence-monad-decidersequence-monad-monadifier에 대한

답변

1

더 일반적인 이름은 bind 및 중 result, return, 또는 unit이다.

(defn bind [mv f] (mapcat f mv)) 
(defn unit [v] [v]) 

그런 다음

(domonad sequence-m 
    [a [1 2] 
    b [10, 100] 
    c [-1 1]] 
    (* a b c)) 

(bind [1 2] 
     (fn [a] 
     (domonad sequence-m 
      [b [10, 100] 
      c [-1 1]] 
      (* a b c)))) 

그것을 시도입니다! 그래서, 여러분이 적절하게 monadic-continuation이라는 이름을 붙인 두 번째 논쟁은 나머지 모나드 인 모나드의 연속입니다. 당신이 수행하는 경우

, 당신은

(bind [1 2] 
     (fn [a] (bind [10 100] 
        (fn [b] (bind [-1 1] 
            (fn [c] (unit (* a b c)))))))) 

domonad 완전히 긴장을 풀 것은 설탕이다. 매우 간단한 구현 at my answer here을 볼 수 있습니다.

관련 문제