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 --> ...