2012-09-08 2 views
1

이것은 this을 본 다음에 모나드 함수를 알아 내려는 시도입니다.이 간단한 모나드 예제입니까?

hbind을 사용하여 두 개의 임의 함수 인 fg을 함께 구성합니다. 이 경우 unit 연산자는 무엇입니까?

;; f :: int -> [str] 
;; g :: str -> [keyword] 
;; bind :: [str] -> (str -> [keyword]) -> [keyword] 
;; h :: int -> [keyword] 

(defn f [v] 
    (map str (range v))) 

(defn g [s] 
    (map keyword (repeat 4 s))) 

(defn bind [l f] 
    (flatten 
    (map f l))) 

(f 8) ;; :: (0 1 2 3 4 5 6 7) 
(g "s") ;; :: (:s :s :s :s) 

(defn h [v] 
    (bind (f v) g)) 

(h 9) 
;; :: (:0 :0 :0 :0 :1 :1 :1 :1 :2 :2 :2 :2 :3 :3 :3 :3 :4 :4 :4 :4 :5 :5 :5 :5) 

아, 의견을 주셔서 감사합니다; 나는 내가 혼란 스러웠던 곳을 본다.

나는 이러한 기능을 잘 알고 있었고 바인드 사용하여 구성하는 방법 :하지만이 기능

f0 :: a -> M a 
g0 :: a -> M a 

을 :

f1 :: a -> M b 
g1 :: b -> M c 

하지만 본질적으로 bind 연산자는 두 경우 모두에 대해 동일 M이 같은 경우 내 경우에는 M이 모나드이므로 f1g1f0g0과 같은 방법으로 결합 할 수 있습니다.

+0

조금 코멘트; 아직도 괜찮은거야? –

답변

1

목록 모나드를 구현하려고합니까? 그렇다면, 다음은 다음과 같습니다

(defn unit [x] 
    [x]) 

이것은 Haskell implementation에 기초한다 : 나는 형식을 변경 한

instance Monad [] where 
    m >>= k    = foldr ((++) . k) [] m 
    return x   = [x] 
+0

예. 그것을 정리 한 – zcaudate

1

이것은 모나드 목록이므로 unit 연산자는 x입니다. & mapsto; [X는, 예

(. 동일한 이름 & 목적 하스켈 함수 후 return 불림)

하나는이 단위 연산자를 검사함으로써 것을 알 수

(defn return [x] [x]) 

the monad laws를 만족시킨다 :

(bind (return a) f) => (bind [a] f) 
     => (flatten (map f [a])) => (flatten [f a]) => f a ;; f returns a vector 

(bind x return)에 대해서도 마찬가지입니다.