並行合成

11月28日木曜日、曇り

ちょっとずつ土曜日の勉強会向けのコードを手直ししている。
今はこんな感じ。

並行合成の展開部分をずいぶんスッキリ書けたと自画自賛している。

* * *

ところで途中、集合のリストの直積を計算する部分の表現を悩んでいる。いまのコードは計算する直積集合の元を「リスト」として表現して、その元のリストを直積集合としている。

実用上はこれで問題ないし、直積集合を考えるときに組み合わせる集合がひとつしかない場合も元として要素がひとつのリストを返すことにもなっていて便利。

しかし本来の直積を考えるとこれでいいんだろうか? という疑念が晴れない。だいたい僕の実装では元の型がすべて型パラメーターEであらわされる共通のものしか計算できない。けれど本来の直積はまったく違った型の集合を組み合わせて順序対をつくる操作。
そして Wikipedia によれば、順序対の中の結合法則は成り立たないので、そうすると結合の順序が見えないリストとして元を表現してしまうと本来の表現力を損なっている、とも言える。

これに対してこんな実装も考えてみたんだけれど……

こちらは正しく、 directProduct は二つの集合の組み合わせをつくる。(flatten はペアで表現した直積をリストに開く操作。しかしいろいろ問題はある)
あくまで二つの集合の結合しかできないので、三つ以上の集合の直積を取るときは結合順序も保たれることになる。

しかし、微妙なところで不便。いや、こちらのほうが正しいはずなんだけれどね。

この記事が気に入ったらサポートをしてみませんか?