有条件地建立一个清单

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在基地的任何地方都存在功能.