Haskell 序列的乐趣
我有一组五个函数,可以称为五种方法之一。我是这样用Patren匹配来表达的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
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)