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

List Haskell:一个列表与另一个列表的子序列的叉积,list,haskell,List,Haskell,我还有一个关于从各种来源生成内容列表的问题 更新:简化了示例 我有一个变量列表 ["a", "b", "c"] 和布尔值 [False, True]. 现在我想要一个列表,其中所有变量的子序列都与值列表交叉,所以对于每个条目,变量的子序列列表都有一组对,每个可能的值 对于上面的列表,我会得到这个(这个场景的完整列表)。由于空列表不能很好地与另一个列表配对,我不在乎它是否是结果列表的一部分(以后可以很容易地添加) 如果只是排列,调用排列并结合理解就足够了,但我不知道如何轻松获得子项的列表。

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

更新:简化了示例

我有一个变量列表

["a", "b", "c"] 
和布尔值

[False, True].
现在我想要一个列表,其中所有变量的子序列都与值列表交叉,所以对于每个条目,变量的子序列列表都有一组对,每个可能的值

对于上面的列表,我会得到这个(这个场景的完整列表)。由于空列表不能很好地与另一个列表配对,我不在乎它是否是结果列表的一部分(以后可以很容易地添加)

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


有没有直接的解决方案?

生成给定列表的所有子序列(不考虑性能)的简单解决方案是:

解决方案::[a]->[b]->[[(a,b)]]
解决方案变量值=do
as[b]->[[(a,b)]]
Data.List Control.Monad Prelude |解决方案变量值=do
数据。列表控件。Monad Prelude |作为表单|打印
[]
[(“a”,假)]
[(“a”,正确)]
[(“b”,假)]
[(“b”,正确)]
[((“a”,假),(“b”,假)]
[((“a”,假),(“b”,真)]
[(“a”,正确),(“b”,错误]
[(“a”,正确),(“b”,正确]
[(“c”,假)]
[(“c”,正确)]
[((“a”,假),(“c”,假)]
[((“a”,假),(“c”,真)]
[(“a”,正确),(“c”,错误]
[((“a”,正确),(“c”,正确)]
[(“b”,假),(“c”,假)]
[((“b”,假),(“c”,真)]
[(“b”,正确),(“c”,错误]
[((“b”,正确),(“c”,正确)]
[((“a”,假),(“b”,假),(“c”,假)]
[((“a”,假),(“b”,假),(“c”,真)]
[((“a”,假),(“b”,真),(“c”,假)]
[((“a”,假),(“b”,真),(“c”,真)]
[((“a”,正确),(“b”,错误),(“c”,错误)]
[((“a”,正确),(“b”,错误),(“c”,正确)]
[((“a”,正确),(“b”,正确),(“c”,错误)]
[((“a”,正确),(“b”,正确),(“c”,正确)]

实际上这里不需要使用单子。下面的内容一开始可能有点吓人,但稍后我会解释。注意:映射和折叠有助于编译器加快代码速度

solution :: [a] -> [b] -> [[(a, b)]]
solution variables values = foldr (<*>) [[]]
  $ map (\variable -> id : map (\value -> (:) (variable, value) ) values)
  $ variables
具有类型
[[(a,b)]->[(a,b)]]
,其中最外层的列表用于要绑定的变量,中间层用于不确定性,内部列表用于已绑定的变量

然后终于有了大结局:折叠!折叠作用于最外层的列表层(对于每个变量,请执行某些操作),并且该列表级别消失。
()
组合了所有的不确定性,它以前是列表的中间层,现在是结果的外层。内层不受影响。折叠的起始值是
[[]]:[[(a,b)]

如果您习惯了非确定性的
替代
界面,您可能更喜欢

solution :: Alternative f => [a] -> f b -> f[(a, b)]
solution variables values = foldr (<*>) (pure [])
  $ map (\variable -> pure id <|> pure (\value -> (:) (variable, value)) <*> values)
  $ variables
解决方案::备选方案f=>[a]->f b->f[(a,b)]
解决方案变量值=foldr()(纯[])
$map(\variable->pure id pure(\value->(:)(变量,值))值)
$variables

因为现在列表操作
(:)
map
是针对变量列表的,而与不确定性有关的一切都由应用程序/替代接口处理。

我不明白目标是什么。类似于
[map(\x->(x,y))xs | xs的东西
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)]
solution :: [a] -> [b] -> [[(a, b)]]
solution variables values = do
  as <- subsequences variables
  bs <- forM as $ const values
  zip as bs
Data.List Control.Monad Prelude> :{
Data.List Control.Monad Prelude| let solution :: [a] -> [b] -> [[(a, b)]]
Data.List Control.Monad Prelude|     solution variables values = do
Data.List Control.Monad Prelude|       as <- subsequences variables
Data.List Control.Monad Prelude|       bs <- forM as $ const values
Data.List Control.Monad Prelude|       return $ zip as bs
Data.List Control.Monad Prelude| :}
Data.List Control.Monad Prelude> 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)]]
Data.List Control.Monad Prelude> forM_ it print
[]
[("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)]
solution :: [a] -> [b] -> [[(a, b)]]
solution variables values = foldr (<*>) [[]]
  $ map (\variable -> id : map (\value -> (:) (variable, value) ) values)
  $ variables
map (\variable -> (id : map (\value -> (:) (variable, value) ) values)) variables
solution :: Alternative f => [a] -> f b -> f[(a, b)]
solution variables values = foldr (<*>) (pure [])
  $ map (\variable -> pure id <|> pure (\value -> (:) (variable, value)) <*> values)
  $ variables