身近なトランスデューサ:文字のエンコード
Aを文字(とりあえず文字番号、またはコードポイント;最近はコードユニット?)だとして、Bはバイト(8ビット・コンビネーション)の集合だとする。エンコーディングがA→B*という関数で与えられというのは嘘で、それはISO-2022-JPを考えれば明らかだろう。
状態をSとして、エンコーディングは A×S→B*×Sとして与えられる。Aに未定義な文字があれば、出力は空だし、エンコード表現に曖昧性/多義性があれば、遷移+出力は部分的かつ非決定性となるから、A×S→Pow(B*×S)となる。状態遷移は確定的にしたいなら、A×S→Pow(B*)×Sとなるが、Powが強モナドなので、テンソル強度:Pow(X)×Y→Pow(X×Y)があるから、A×S→Pow(B*)×SをA×S→Pow(B*×S)に埋め込める。
Aに合成文字の素片が含まれると、A×Sでは遷移が定義できないがA*×Sでは定義できることになる。A×S→Pow(B*×S)をA*×S→Pow(B*×S)に埋め込むのは簡単だ。
まとめると: