Concurrent Clean : 大域脱出
よく考えたら、大域脱出も無名関数でできる。
Start w = w --> stdio --> \(f,w) = "abcdef" --> \(s) = f --> fwrites "n = " --> fwritei (size s) --> fwrites "\n10 < n => abort\n" --> if (10 < size s) (fwrites "abort!") \f = f --> fwrites s --> fwrites "\n7 < n => abort\n" --> if (7 < size s) (fwrites "abort!") \f = f --> fwrites s --> fwrites "\n5 < n => abort\n" --> if (5 < size s) (fwrites "abort!") \f = f --> fwrites s --> fwrites "\n3 < n => abort\n" --> if (3 < size s) (fwrites "abort!") \f = f --> fwrites s
無名関数万歳!
-
-
- -
-
下のような関数を作っておくと便利かも。
on_error f g (ok,u) = if (not ok) (f u) (g u) on_error2 f g (ok,x,u) = if (not ok) (f x u) (g x u)
でも、さすがにcase文でこういう場合は、無名関数では収まらない。whereブロックの中に別の関数を立ててつなげておくしかなさそう。
--> \(err, u) = case err of NoError = next u _ = trace "error!" u where next u = u --> ...