gpt4 book ai didi

haskell - 有条件地建立一个列表

转载 作者:行者123 更新时间:2023-12-04 10:17:53 24 4
gpt4 key购买 nike

我想从 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 在这里并没有真正的帮助,当然,可能有更好(/更常见)的方式来做这些事情。

最佳答案

我喜欢使用 concat在这种情况下使用列表推导:

concat
[ [a | opt1]
, [b | opt2]
, [c | opt3]
]
[a | opt1]如果 opt1 是空列表为 False,否则为仅包含 a 的单例列表.

您也可以使用 <$guard :
concat
[ a <$ guard opt1
, b <$ guard opt2
, c <$ guard opt3
]

我认为不存在 onlyIf在基地的任何地方发挥作用。

关于haskell - 有条件地建立一个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25057634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com