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