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