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