Concurrent Clean : 大域脱出2

tryという関数を作ってみた。

::Try a b = Break a | Continue b

try f g x :== case f x of
                Break a = a
                Continue b = g b

Start w = w --> stdio
            --> \(f,w) = ([],f,w)
            --> try check 
                    \(f,w) = f
            --> fwrites "hello world"
            --> flip fclose w
            --> \(ok,w) = if ok w
                                (trace "error on close file" w)
  where
    check (ls,f,w) = case ls of
                      [] = Break (snd $ fclose f w)
                      _  = Continue (f,w)

一般的な名前を使ってしまうと、後で困ることがあるかもしれないけど・・・