2012-04-04 102 views
2

我有一套五個功能,可以稱爲五種方式之一。我表示,隨着像這樣百通匹配,有趣的序列

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 
barbaz

等等都設置了同樣

我知道如何使用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 2012-04-04 22:20:54

3

我想補充以前的答案。 只要您的值構造函數的順序與步驟的執行順序相同,就可以指定deriving (Enum)。這將允許您將所有Step s的列表編寫爲[PreVal..PostVal]並縮短代碼。

此外,請考慮在PreVal之前或PostVal之後添加步驟的情況。爲了確保您的呼叫考慮新引入的步驟,最好還要爲Bounded定義一個實例,然後在代碼中使用minBoundmaxBound

+0

縮短,並移除一處更改的地方如果我添加了一個步驟。謝謝你的提示。 – 2012-04-04 22:21:28

+0

@MichaelLitchard:不是,看到我的編輯:) – 2012-04-04 22:26:56