HaskellでWPF

だがしかし、どうしてもgtkがなんとなくなじまない。
GUIに関してはWPFがすごく気に入っているので(WPFの最大の欠点は.Netだということだ)、WPFをどうしても使いたい、という気持ちを捨てきれなかった。
しょうがないから自分でラッパーを書いてみようか、ということで、C++/CLIでラッパーDLLを作って、FFIで呼び出してみたところ、思ったよりすんなりWindowを出すところまではいけた。
以下がHaskell側のコードの一部。
命名規約がHaskellっぽくないけど、将来的にWPF全体をラッピングしたらどういう命名規則にするのがいいかなあなどと浅はかな考えでとりあえずやってみた感じ。

threadWork :: Thread -> IO ()
threadWork thread = do
    app <- netApplication_New
    window <- netWindow_New
    netApplication_Run app window
    netApplication_Delete app
    return ()

main :: IO ()
main = do
    thread <- netThread_New
    netThread_SetApartmentState thread STA
    work <- wrapThreadWork $ threadWork
    netThread_Start thread work
    netThread_Join thread
    netThread_Delete thread
    return ()

こんな感じで動くようなところまではもってけるものの、当然のことながら.Netのクラスを全部手動でラッパー作成するのは労力的に無謀、ということでReflectionから情報吸い出して、対応するHaskellのコードやラッパーのコードを自動生成するようにしたいなあ。
ただ、問題はデリゲートを統一的に扱ういい方法が今のところまだ思いついてないということ。動的にILコードを生成するとかやればいけなくはなさそうだけど、まだ試せていない。
 追記:ラッパークラスを作ってやるだけで割と簡単にいけるっぽい。

てか、これを応用するとIronRubyじゃないrubyからもWPFするとかもできそうね。

調べてみた限りではHaskellWPFの需要はあまりなさそうに見えたんだけど、世間的にはどうなんだろう。もしいろいろうまく解決できたら、ちゃんとしたライラブリっぽくした方がいいのかしらん。