Monad by Scheme

(define (Monad val)
  (cons val ())) ; モナドを作成

(define (Return monad)
  (car val)) ; モナドから値を取り出す

(define (>>= monad func)
  (let* ((val (Return monad))) ; モナドの値を取り出す
    (func monad))) ; 取り出した値にfunc適応(funcはモナドを返す)

(define (sample-func val)
  (let ((fugahoge val)) ; 値に何らかの処理を加える
    (Monad let))) ; モナドにして返す

コンテナのアナロジーをより分かり易くする為にconsを使ってみた。モナド演算子を使って、(>>= (>>= (>>= (Monad initialData) func1) func2) func3)の様にする事で計算の流れを作り出せる。ただ、Lispだとあんまし視覚的じゃないなぁ。やっぱりHaskellみたく、(Monad initialData) >>= func1 >>= func2 >>= func3と書けると、計算の流れを作り出しているかのようである。