早川です。

On Fri, 11 Apr 2003 12:04:13 +0900
shelarcy <shelarcy / capella.freemail.ne.jp> wrote:
> Haskell では関数を引数にとることができるし、「.」(関数合成)が関数の
> 定義に使えるので、いわゆる Design Pattern の Template Method は不
> 要です。

上記の Haskell のメリットから、なぜ Template Method が不要
となるのかが分かりません..
何か具体的な例などは、ありませんでしょうか。

> 「なぜ関数プログラミングは重要か」を読めばこのことが理解できると思
> います。

僕を Haskell に夢中にさせてくれたのが
まさにこの文書です。

Haskell の記述力には、感激してばかりですが
実務で使おうとすると泥臭いコードだらけになってしまいそうで..
理解できていない&使いこなせていないのだと思いますが。

試しに↓にあったサンプルを Haskell で書き直してみました。
http://www.dofactory.com/Patterns/PatternTemplate.aspx

$ cat DataObject.hs
module DataObject where

class DataObject a where
    connect    :: a -> IO ()
    select     :: a -> IO ()
    process    :: a -> IO ()
    disconnect :: a -> IO ()
    run        :: a -> IO ()
    run obj = do
        connect    obj
        select     obj
        process    obj
        disconnect obj

$ cat try.hs
module Main where

import DataObject

newtype CustomerDataObject = CustomerDataObject ()
instance DataObject CustomerDataObject where
    connect    obj = print "connect"
    select     obj = print "select"
    process    obj = print "process"
    disconnect obj = print "disconnect"

newMyData :: CustomerDataObject
newMyData = CustomerDataObject ()

main = run newMyData


DataObject.hs は、モジュール開発者によって提供されるもので
run をモジュール利用者が overload することはありません。
-- 複雑な処理が多く、共通のアルゴリズムを提供するものであるため

モジュール利用者は、新しい型、必要なメソッドを定義して
run を呼び出します。
-- 話を簡単にするため CustomerDataObject は無引数になってます

これを元のコードを無視して、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

-- オブジェクト指向言語で型を使わずに書いた
-- プログラムのようになってしまいました。。


--
SH
tetryl / tokyoprogrammer.com


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