gpt4 book ai didi

list - Haskell:一个列表与另一个列表的子序列的叉积

转载 作者:行者123 更新时间:2023-12-04 02:49:01 26 4
gpt4 key购买 nike

我有另一个关于从各种来源生成内容列表的问题。

更新:简化了示例

我有一个变量列表

["a", "b", "c"] 

和 bool 值

[False, True].

现在我想要一个列表,其中包含变量列表的所有子序列与值列表交叉,因此对于每个条目,变量的子序列列表都有一组对,每个可能的值。

对于上面的列表,我会得到这个(这个场景的完整列表)。由于空列表不会与其他列表配对得很好,我不关心它是否是结果列表的一部分(稍后可以轻松添加)。

[
[],
[("a", False)],
[("a", True)],
[("b", False)],
[("b", True)],
[("c", False)],
[("c", True)],
[("a", False), ("b", False)],
[("a", False), ("b", True)],
[("a", True), ("b", False)],
[("a", True), ("b", True)],
[("a", False), ("c", False)],
[("a", False), ("c", True)],
[("a", True), ("c", False)],
[("a", True), ("c", True)],
[("b", False), ("c", False)],
[("b", False), ("c", True)],
[("b", True), ("c", False)],
[("b", True), ("c", True)],
[("a", False), ("b", False), ("c", False)],
[("a", False), ("b", False), ("c", True)],
[("a", False), ("b", True), ("c", False)],
[("a", False), ("b", True), ("c", True)],
[("a", True), ("b", False), ("c", False)],
[("a", True), ("b", False), ("c", True)],
[("a", True), ("b", True), ("c", False)],
[("a", True), ("b", True), ("c", True)],
]

如果只是排列,调用排列结合理解就足够了,但我不知道如何轻松获得子序列的列表。我可以在不同大小的列表上使用“调用排列 + 理解”方法,但这听起来不太优雅。

有没有直接的解决方案?

最佳答案

import Control.Monad (forM)
import Data.List (subsequences)

solution :: [a] -> [b] -> [[(a, b)]]
solution variables values = do
sequence <- subsequences variables
forM sequence $ \variable -> do
value <- values
return (variable, value)

它有效的证明:

>>> mapM_ print $ solution ["a", "b", "c"] [False, True]
[]
[("a",False)]
[("a",True)]
[("b",False)]
[("b",True)]
[("a",False),("b",False)]
[("a",False),("b",True)]
[("a",True),("b",False)]
[("a",True),("b",True)]
[("c",False)]
[("c",True)]
[("a",False),("c",False)]
[("a",False),("c",True)]
[("a",True),("c",False)]
[("a",True),("c",True)]
[("b",False),("c",False)]
[("b",False),("c",True)]
[("b",True),("c",False)]
[("b",True),("c",True)]
[("a",False),("b",False),("c",False)]
[("a",False),("b",False),("c",True)]
[("a",False),("b",True),("c",False)]
[("a",False),("b",True),("c",True)]
[("a",True),("b",False),("c",False)]
[("a",True),("b",False),("c",True)]
[("a",True),("b",True),("c",False)]
[("a",True),("b",True),("c",True)]

关于list - Haskell:一个列表与另一个列表的子序列的叉积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18146252/

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