Deb*_*ski 7 haskell idioms conditional-statements
我想从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.
Run Code Online (Sandbox Code Playgroud)
我有类似的东西
onlyIf :: MonadPlus m => a -> Bool -> m a
onlyIf a p = if p then return a else mzero
Run Code Online (Sandbox Code Playgroud)
要么
mwhen :: Monoid a => Bool -> a -> a
mwhen p a = if p then a else mempty
Run Code Online (Sandbox Code Playgroud)
记住,然后可以使用像
a `onlyIf` opt1 <>
b `onlyIf` opt2 <>
c `onlyIf` opt3
Run Code Online (Sandbox Code Playgroud)
要么
mwhen opt1 [a] <>
mwhen opt2 [b] <>
mwhen opt3 [c]
Run Code Online (Sandbox Code Playgroud)
Hoogle在这里并不是真的有用,当然,可能有更好(/更常见)的方式来做这些事情.
ben*_*ofs 12
concat
在这种情况下,我喜欢使用列表推导:
concat
[ [a | opt1]
, [b | opt2]
, [c | opt3]
]
Run Code Online (Sandbox Code Playgroud)
[a | opt1]
如果opt1
为False 则为空列表,否则为仅包含的单例列表a
.
您也可以使用<$
和guard
:
concat
[ a <$ guard opt1
, b <$ guard opt2
, c <$ guard opt3
]
Run Code Online (Sandbox Code Playgroud)
我不认为onlyIf
在基地的任何地方都存在功能.
归档时间: |
|
查看次数: |
188 次 |
最近记录: |