2

私には5つの関数のセットがあり、5つの方法の1つと呼ぶことができます。私はそれをパターンマッチングで表現しています、

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

などとbar同様bazに設定されます

sequenceアクションのリストを呼び出すために使用する方法を知っています。が与えられた[Step]場合、どうすれば電話をかけることができますか[foo,bar,baz]。順番に、可能な各ステップを呼び出します。

だからそれはこれを行うべきです foo PreVal foo PreProc ...など bar Preval bar PreProc ..など baz...

4

3 に答える 3

5
mapM_ (\ f -> mapM_ f [PreVal, PreProc, Proc, PostProc, PostVal]) [foo, bar, baz]
于 2012-04-04T22:02:25.517 に答える
3

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

PreValさらに、の前後にステップを追加する場合を考えてみましょうPostVal。呼び出しが新しく導入されたステップを考慮していることを確認するには、インスタンスも定義してから、コードでとBoundedを使用することをお勧めします。minBoundmaxBound

于 2012-04-04T22:18:52.277 に答える
2
doThemAll steps = sequence_ $ do
    f <- [foo, bar, baz]
    step <- steps
    return (f step)
于 2012-04-04T22:13:16.317 に答える