2012-04-04 12 views
2

私は5つの方法のうちの1つと呼ばれる5つの機能のセットを持っています。私はそうのような摂餌・マッチングで、シーケンスで楽しい

barbaz
type Configure = ReaderT Config IO() 
data Step = PreVal 
      | PreProc 
      | Proc 
      | PostProc 
      | PostVal 

foo :: Step -> Configure 
foo PreVal = do some stuff 
foo PreProc = do some stuff 

ので、が、私はアクションのリストを呼び出すためにsequenceを使用する方法を知っている同様

に設定されていること。表現しています[Step]が与えられたら、どうすれば[foo,bar,baz]に電話をかけることができますか?それぞれの可能なステップを呼び出すことができます。私は追加したい

ので、それがこの foo PreVal foo PreProc を行う...など bar Preval bar PreProc ..に及びそう baz上の必要があります...

答えて

5
mapM_ (\ f -> mapM_ f [PreVal, PreProc, Proc, PostProc, PostVal]) [foo, bar, baz] 
2
doThemAll steps = sequence_ $ do 
    f <- [foo, bar, baz] 
    step <- steps 
    return (f step) 
+3

また、 '' 'sequence_ $ [foo、bar、baz]' ap' steps'''(または '' ap''の代わりに '' <*>'') – hammar

3

前の答えに何か 値コンストラクタの順序がステップの実行順序と同じであれば、deriving (Enum)と指定できます。これにより、すべてのStepのリストを[PreVal..PostVal]と書いてコードを短縮することができます。

さらに、PreValより前またはPostValより前にステップを追加する場合を考えます。あなたの呼び出しが新たに導入されたステップを考慮するためには、Boundedのインスタンスを定義し、コードにminBoundmaxBoundを使用する方がよいでしょう。

+0

変更が必要な場所を1つ減らして削除します私がステップを追加した場合に作成されます。先端に感謝します。 –

+0

@MichaelLitchard:実際には、私の編集を参照してください:) –

関連する問題