豊福です。

shelarcyさん
 > 特に Part II はそっけない書き方ですね。

   Continuation monad のところを読んだのですがこの説明だけでは
何やってるのか全然理解できませんでした。「runCont」でググって
見つけた
     http://www.haskell.org/hawiki/ContinuationPassingStyle
     http://www.haskell.org/hawiki/MonadicContinuationPassingStyle
を読んでやっと理解できました。

   勉強がてら ruby で書いてみましたが動きますね。(って当たり前か)

def Cont(&prc); Cont.new(prc); end
def Return a; Cont{|k| k[a]}; end
class Cont
   def initialize prc; @prc = prc; end
   def [](x); @prc[x]; end # runCont
   def run(&x); self[x]; end # runCont
   def bind(&f); Cont{|k| run{|a| f[a][k]}}; end
end
Id = proc{|x| x}
def callCC f; Cont{|k| f[proc{|a| Cont{k[a]}}][k]}; end

def fac n; fac2(n)[Id]; end
def fac2 n
   if n < 2; Return 1; else; fac2(n-1).bind {|x| Return(x*n)}; end
end

p(fac(5))

def divide x, y
   divid = proc{|esc|
         (if y == 0; esc["Division by zero"]; else; Return y; end).bind {|z|
                 Return("Quotient #{x/z}, Remainder #{x%z}")
         }
   }
   callCC(divid).run {|s| print s, "\n"}
end

divide(5, 2)
divide(3, 0)
---
                         豊福
                         nobu_toyofuku / nifty.com


--
ML: haskell-jp / quickml.com
使い方: http://QuickML.com/