Haskell列表monad循环

Ric*_*Han 2 monads haskell list-comprehension

我有一个列表理解,看起来像这样:

cross ps = [  p* pp * ppp | p <- ps, pp <- ps, ppp <- ps, p >= pp , pp >= ppp ]
Run Code Online (Sandbox Code Playgroud)

如何使用monads实现这一点,而无需输入列表名称?

dim ps n = do
    p <- ps
    pp <- ps
    ppp <- ps
    p...p <- ps

    guard (p >= pp && pp >= ppp ... && p...p >=p....p)
    return (p*pp*ppp*p...p)
Run Code Online (Sandbox Code Playgroud)

如何在不显式赋值的情况下使用列表monad?

Luk*_*vat 7

这是我怎么做的

ascending :: Ord a => [a] -> Bool
ascending list = and $ zipWith (>=) (tail list) list

dim ps n = map product $ filter ascending allComb 
    where allComb = replicateM n ps
Run Code Online (Sandbox Code Playgroud)

将replicateM来自Control.Monad与该列表单子它产生的所有组合n给定列表中的元素.然后我只筛选出升序排列的组合,最后计算剩余列表的产品.