Concurrent Clean : with
withはcaseやガードと組み合わせることで効果を生み出す。
まず、caseとの組み合わせ。
f a # a = add1 a //(1) = case a of 0 = add1 0 //(2) a = add1 a //(3)
に対して、次のように書くと、(3)の所だけadd1が有効になる
f a # a = add1 a //(1) = case a of 0 = add1 0 //(2) a = add1 a //(3) with add1 = (+) 1
のに対して、次のように書くと、(1),(2),(3)の全てでadd1が有効になる。
f a # a = add1 a //(1) = case a of 0 = add1 0 //(2) a = add1 a //(3) with add1 = (+) 1
次にガードとの組み合わせ。
g a # a = add1 a //(4) | a > 0 = add1 a //(5) = add1 0 //(6)
に対して、次の2つはどちらも(5)の所だけadd1が有効になる。
g a # a = add1 a //(4) | a > 0 = add1 a //(5) with add1 = (+) 1 = add1 0 //(6)
g a # a = add1 a //(4) | a > 0 = add1 a //(5) with add1 = (+) 1 = add1 0 //(6)
また、let-before (#)については、次のように書くと、(4)の所だけadd1が有効になる。
g a # a = add1 a //(4) with add1 = (+) 1 | a > 0 = add1 a //(5) = add1 0 //(6)
しかし、次のように書くと、文法エラー。
g a # a = add1 a //(4) with add1 = (+) 1 | a > 0 = add1 a //(5) = add1 0 //(6)
さらに、次のように書くと、(8)の所のみadd1が有効になる。
h a # a = add1 a //(7) a = add1 a //(8) with add1 = (+) 1 a = add1 a //(9) = a
しかし、次のように書いた場合は、(7),(8),(9)ですべてadd1が有効になる。
h a # a = add1 a //(7) a = add1 a //(8) a = add1 a //(9) = a with add1 = (+) 1