Concurrent Clean : ObjectIO

Cleanをはじめた頃に、ちょっとやって挫折して、そのままほったらかしにしてあったObjectIOをすこし触ってみた。というのは、Clean入門の一意性のところを書くにあたって、GUIアプリケーションのことを無視しておくわけにはいかないと思ったからだ。といっても、Clean入門でObjectIOを直接取り扱う気はないのだが。
ObjectIOでもっとも気になっているのは、状態をどのように取り扱うのかというところなのだが、それはとりあえず置いておいて、基本的な書式を見てみる。下は、"Hello World!"のサンプル。

Start :: *World -> *World
Start world
    = startIO NDI
              Void
              (snd o openDialog Void hello)
              [ProcessClose closeProcess]
              world
  where
    hello   = Dialog ""
                     (TextControl "Hello world!" [])
                     [WindowClose (noLS closeProcess)]

startIO関数でGUIアプリケーションを起動する。第3引数が初期化処理で、"PSt .l -> PSt .l"型の関数を与える。第4引数はGUIアプリケーションのプロパティで、イベント処理を与える。ここでは、アプリケーション終了時の処理を与えている。
初期化処理のところで、openDialog関数を与えてダイアログを表示している。第2引数はダイアログオブジェクト(?)で、whereブロック内で生成している。Dialog関数がダイアログオブジェクトのコンストラクタで、第2引数が初期化処理だ。ここで、ダイアログ内のコントロールを生成している。第3引数はダイアログのプロパティで、イベント処理やダイアログの外観を与える。ここでは、ダイアログの「×」ボタンをクリックしたときの処理を与えている。
と、ここまでサンプルを参考に作ったところで、昔の挫折がフラッシュバックした。このままではダイアログが画面の左上の隅っこに表示されてしまうのだが、これを画面中央に表示したいと思って、プロパティを変更しようと思ったのだが、どのプロパティをどう変更すればいいのか分からない・・・。あれこれためしても外ればかり。困った。