List 列表理解的一元方法
我有以下功能List 列表理解的一元方法,list,haskell,recursion,monads,List,Haskell,Recursion,Monads,我有以下功能 combinations :: [[a]] -> [[a]] combinations [] = [[]] combinations (xs:xss) = concat [map (x:) yss | x <- xs] where yss = combinations xss 我觉得一定有一种一元的方法可以做到这一点 foobar = do n <- [1,2] ch <- [3,4,5] return[n,ch]
combinations :: [[a]] -> [[a]]
combinations [] = [[]]
combinations (xs:xss) = concat [map (x:) yss | x <- xs]
where yss = combinations xss
我觉得一定有一种一元的方法可以做到这一点
foobar = do
n <- [1,2]
ch <- [3,4,5]
return[n,ch]
foobar=do
我能想到的最好的办法是
combinations [] = [[]]
combinations (xs:xss) = do
x <- xs
ys <- combinations xss
return $ x : ys
然后我意识到map(x:)yss
就是fmap(x:)yss
,也就是yss>>=return。(x:)
,所以我知道我能做到
combinations (xs:xss) =
let yss = combinations xss
in do
x <- xs
ys <- yss
return $ x : ys
组合(xs:xss)=
设yss=组合xss
在做
我能想到的最好的办法是
combinations [] = [[]]
combinations (xs:xss) = do
x <- xs
ys <- combinations xss
return $ x : ys
然后我意识到map(x:)yss
就是fmap(x:)yss
,也就是yss>>=return。(x:)
,所以我知道我能做到
combinations (xs:xss) =
let yss = combinations xss
in do
x <- xs
ys <- yss
return $ x : ys
组合(xs:xss)=
设yss=组合xss
在做
x您的函数用于列表monad
> :t sequence
sequence :: Monad m => [m a] -> m [a]
> sequence [[1,2],[2,3,4],[5,6]]
[[1,2,5],[1,2,6],[1,3,5],[1,3,6],[1,4,5],[1,4,6],[2,2,5],[2,2,6],[2,3,5],[2,3,6],
[2,4,5],[2,4,6]]
您的函数用于列表monad
> :t sequence
sequence :: Monad m => [m a] -> m [a]
> sequence [[1,2],[2,3,4],[5,6]]
[[1,2,5],[1,2,6],[1,3,5],[1,3,6],[1,4,5],[1,4,6],[2,2,5],[2,2,6],[2,3,5],[2,3,6],
[2,4,5],[2,4,6]]
这与这个问题非常相似:这与这个问题非常相似:谢谢,你的答案是显而易见的选择。但是我接受了@bheklillr的回答,因为这更接近我的思考过程。谢谢,你的答案是显而易见的选择。但我接受了@bheklir的回答,因为这更接近我的思考过程。