Haskell 序列的乐趣

Haskell 序列的乐趣,haskell,Haskell,我有一组五个函数,可以称为五种方法之一。我是这样用Patren匹配来表达的 type Configure = ReaderT Config IO () data Step = PreVal | PreProc | Proc | PostProc | PostVal foo :: Step -> Configure foo PreVal = do some stuff foo PreProc = do some

我有一组五个函数,可以称为五种方法之一。我是这样用Patren匹配来表达的

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预编程
... 等等
bar-Preval
条码预处理
.. 等等
baz
..

doThemAll steps=sequence\uuu$do
mapM_ (\ f -> mapM_ f [PreVal, PreProc, Proc, PostProc, PostVal]) [foo, bar, baz]

f我想在前面的答案中添加一些内容。 只要值构造函数的顺序与步骤的执行顺序相同,就可以指定
派生(Enum)
。这将允许您将所有
步骤的列表写为
[PreVal..PostVal]
,并缩短代码


此外,考虑一个在代码<普雷瓦尔> <代码>或代码< > PASSWAVE>代码>之后的步骤。为了确保您的调用考虑新引入的步骤,您最好也定义一个实例:<代码>有界,然后在代码中使用<代码>下界和<代码> Max绑定<代码>。如果我添加了一个步骤,则会删除另一个需要进行更改的位置。谢谢你的提示。

doThemAll steps = sequence_ $ do
    f <- [foo, bar, baz]
    step <- steps
    return (f step)