こんにちは。早川です。

On Sun, 20 Apr 2003 10:49:02 +0900
shelarcy <shelarcy / capella.freemail.ne.jp> wrote:
> 言ってみれば関数型で構築されるオブジェクトはCLOSや存在論などの何らかのクラス
> 機構をもたない限り強制的にVisitorなオブジェクトのようなものです。(OHaskellに
> ついてはよく知りませんが)
> よってオブジェクト指向的なやり方はうまくいきません。

僕も O'Haskell については良く知りませんが、
Haskell 標準の機能でないものはできるだけ使いたくありません。
決して難しい事をしようとしてるとも思えないのですが..

> ええと、つまり、オブジェクト指向のやり方では役割ごとに次々と違うオブジェクトを
> 作っていくのに対し、関数型言語では次々と特殊化・カリー化した関数を定義していく
> ことになります。

特殊化とは具体的にどういう事でしょうか?
カリー化した関数を定義するだけなら関数型でない言語でも可能ですよね。
それだと関数型言語のメリットとは単なる記述性という事に
なってしまわないでしょうか。

> > $ cat DataObject.hs
> > module DataObject where
> >
> > run :: a -> (a -> IO ()) -> (a -> IO ()) -> (a -> IO ())
> > -> (a -> IO ()) -> IO ()
> > run o c s p d = do {c o; s o; p o; d o}
> >
> > $ cat try.hs
> > module Main where
> >
> > import DataObject
> >
> > connect    obj = print "connect"
> > select     obj = print "select"
> > process    obj = print "process"
> > disconnect obj = print "disconnect"
> >
> > main = run "foo" connect select process disconnect
> 
> この場合、connect に対応する disconnect が必要になるのは
> 分かりきっているので、
> 
> myrun foo hoge huga = run foo connect hoge huga disconnect
> 
> ということをやるのが常套手段になります。

論点がずれてしまったような感じがします。

質問の仕方が悪かったのかもしれませんが
自分のやりたいのは Haskell でフレームワークを構築する事です。
そこでオブジェクト指向言語で最も使われるパターンの1つである
Template Method の実現方法を質問させて頂きました。
単に便利な関数の寄せ集めではなく、そこに構造を持たせて
初めてフレームワークと呼べると思います。
-- オブジェクト指向ではオブジェクト階層で構造を表現するのに対し
-- Haskell では高階関数を用いて、それを表現する??

例えば、以下のようなコードをユーザが定義しなければならないとして

fact n   | n == 0
         | n > 0  = n * fact(n-1)

sumInt n | n == 0 = 0
         | n > 0  = n + sumInt(n-1)

sumSqr n | n == 0 = 0
         | n > 0  = n + sumSqr(n-1)

↓の関数がフレームワークで定義されていれば

induction base comb n | n == 0 = base
                      | n > 0  = comb n (induction base comb (n-1))

下記の様にユーザは簡単に処理を記述する事ができます。

fact   n = induction 1 (*) n
sumInt n = induction 0 (*) n
sumSqr n = induction 0 (\x y -> x*x + y) n

これは正に処理をテンプレート化している例だと思います。
ここでのキモは、ユーザの定義する型をフレームワーク側が
あらかじめ知っているという事です。(base や comb)
ところが、ここで複雑なデータ構造が絡んでくると
もうどうしたらよいのかサッパリで...

ゼロから Haskell で書き直すのではなく
コードを移植する場合も問題は単純ではないようです。
以下の文書が参考になりました。
http://research.microsoft.com/Users/simonpj/Papers/oo-haskell/

少し頭を整理して出直します..

--
SH
tetryl / tokyoprogrammer.com


--
ML: haskell-jp / quickml.com
使い方: http://QuickML.com/