我有一组五个函数,可以称为五种方法之一。我是这样用patern-matching表达的,
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
...
答案 0 :(得分:5)
mapM_ (\ f -> mapM_ f [PreVal, PreProc, Proc, PostProc, PostVal]) [foo, bar, baz]
答案 1 :(得分:3)
我想在之前的答案中添加一些东西。
只要值构造函数的顺序与步骤的执行顺序相同,您就可以指定deriving (Enum)
。这样您就可以将所有Step
的列表写为[PreVal..PostVal]
并缩短代码。
此外,请考虑在PreVal
之前或PostVal
之后添加步骤的情况。为确保您的调用考虑新引入的步骤,您最好定义Bounded
的实例,然后在代码中使用minBound
和maxBound
。
答案 2 :(得分:2)
doThemAll steps = sequence_ $ do
f <- [foo, bar, baz]
step <- steps
return (f step)