Monad in Scheme (3) : Maybeモナド

そうすると、Maybeモナドも書けるよねという話。Maybeモナドというのは、モナド計算の過程で計算がfaiする可能性がある場合に使われるもので、途中で計算がfailするとNothingという値がモナド計算の最後まで伝播していくというモナドである。下記コードのTestの2番目を見ていただけるとイメージが掴めると思う。詳しくはall about monad : Maybeというモナドを参考の事。

; Monad Function
(define (>>= val args)
  (let ((m (if (eq? val 'Nothing)
               (return 'Nothing)
               ((car args) val)))
        (rest (cdr args)))
    (if (null? rest)
        m
        (apply m rest))))

(define (return val)
  (lambda (op . args)
    (op val args)))

(define Nothing (gensym))

; Util                                                                                                                                         
(define (monad-val monad)
  (monad (lambda (val . args) val)))

; User Func                                                                                                                                    
(define (inc n) (return (+ n 1)))
(define (fail n) (return 'Nothing))

; Test                                                                                                                                         
(print (monad-val ((return 1) >>= inc >>= inc  >>= inc)))
(print (monad-val ((return 1) >>= inc >>= fail >>= inc)))

しかし、Monad in Schemeという内容モロかぶりなページを発見。でも、こっちの方が書き方的に格好良いな。説明は向こうの方が分かり易いけど^_^;