Concurrent Clean : PassFail

[id:lethevert:20061126:p2]で導入したPassFailだけれど、'!*Handle -> (!PassFail Info Error, !*Handle)'という組合せで使うことが多くて、かつこれをモナドで使うことを考えて、

::PassFail u e i
    = (Pass) infix 0 !u !i
    | (Fail) infix 0 !u !e

という風に定義しなおすことを検討している。
自分のライブラリを見たところ、正規表現モジュールで、一意型と組み合わせないで使っている所があったので、両方定義しておくのがよいのか。(パーサーとかで使う可能性があるのかな?)

      • -

要件をいろいろ検討しているうちに、汎用として定義するよりも、専用で定義するほうがよさそうだという結論に至った。
理由として、モナドを作るときに、

model1 cgi mh = let ... in mh Pass ...
model2 cgi mh = let ... in mh Pass ...

mapping cgiM
    = cgiM >>\
      model1 >>= \m1 =
      model2 >>= \m2 =
      return [view1 m1, view2 m1 m2]

という風に書きたい。つまり、modelの第1引数のcgiは共有変数にして関数の返値に含ませたくないのだが、上の拡張したPassFailを使うとそのように書くことができないため。

      • -

あれ?書けるかも? ← 書けなかった。