有序的乐趣

时间:2012-04-04 21:56:59

标签: haskell

我有一组五个函数,可以称为五种方法之一。我是这样用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

依此类推barbaz

我知道如何使用sequence来调用操作列表。给定[Step],我该如何调用[foo,bar,baz]。按顺序,同时也呼吁每个可能的步骤。

所以应该这样做 foo PreVal foo PreProc ... 等等 bar Preval bar PreProc .. 等等 baz ...

3 个答案:

答案 0 :(得分:5)

mapM_ (\ f -> mapM_ f [PreVal, PreProc, Proc, PostProc, PostVal]) [foo, bar, baz]

答案 1 :(得分:3)

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

此外,请考虑在PreVal之前或PostVal之后添加步骤的情况。为确保您的调用考虑新引入的步骤,您最好定义Bounded的实例,然后在代码中使用minBoundmaxBound

答案 2 :(得分:2)

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