【发布时间】:2014-09-23 07:45:41
【问题描述】:
我想从 Haskell 中的一堆其他预定义变量构建一个命令行参数列表。与许多命令行参数的性质一样,这些参数要么存在,要么不存在。
在 Haskell 中有条件地构建列表有一个通用的习惯用法吗? if-then-else 方法感觉相当乏味:
import Control.Monad
join [ if opt1 then [a] else []
, if opt2 then [b] else []
, if opt3 then [c] else [] ]
-- gives me back [a, c] or something like that.
我有类似的东西
onlyIf :: MonadPlus m => a -> Bool -> m a
onlyIf a p = if p then return a else mzero
或
mwhen :: Monoid a => Bool -> a -> a
mwhen p a = if p then a else mempty
记住,然后可以像这样使用
a `onlyIf` opt1 <>
b `onlyIf` opt2 <>
c `onlyIf` opt3
或
mwhen opt1 [a] <>
mwhen opt2 [b] <>
mwhen opt3 [c]
Hoogle 在这里并没有真正的帮助,当然,可能有更好(/更常见)的方式来做这些事情。
【问题讨论】:
-
concatMap snd . filter fst怎么样 :) -
@josejuan 没想到。似乎绝对比我自己的例子更惯用。 :)
标签: haskell conditional-statements idioms