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......

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). 这将允许您编写所有Steps的列表[PreVal..PostVal]并缩短代码。

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

于 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 回答