Concurrent Clean : インデントが深くなるのを避けるには

一番下の例のインデントが深いので、caseを使ってもインデントが深くなるのを避ける方法を探していた。
あれこれ試して、継続を使った次のようなものを考える。しかし、これは不要なthunkが入ってしまう。

Start w
    = (\cont
       = case path "tmp" w of
           (Fail msg, w) = trace_error_msg msg w
           (Pass p  , w) = cont p w)
    $ (\cont p w
       = case mktempfile p "data" 10 ".tmp" w of
           (Fail msg, w) = trace_error_msg msg w
           (Pass f  , w) # f = f |>* "test"
                         = cont f w)
    $ (\f w
       = snd $ fclose f w)

さらに考えて、番号を振って、次のようなものはどうか?これは、不要なjmp命令が入ってしまうが、許容範囲か?

Start w = `1 w
  where
    `1 w
      = case path "tmp" w of
         (Fail msg, w) = trace_error_msg msg w
         (Pass p  , w) = `2 p w
    `2 p w
      = case mktempfile p "data" 10 ".tmp" w of
         (Fail msg, w) = trace_error_msg msg w
         (Pass f  , w) # f = f |>* "test"
                       = `3 f w
    `3 f w
      = snd $ fclose f w

こんなのはどうかねぇ?

Start w = path "tmp" w |> `1
  where
    `1 (Fail msg, w) = trace_error_msg msg w
    `1 (Pass p  , w) = mktempfile p "data" 10 ".tmp" w
                     |> `2
    `2 (Fail msg, w) = trace_error_msg msg w
    `2 (Pass f  , w) # f = f |>* "test"
                     = fclose f w
                     |> `3
    `3 (_,w) = w