擅长:python、mysql、java
<p>只需使用lazy-ST。在Haskell中,普通的旧列表与Python生成器基本相同,因此我们将返回一个结果列表(其中结果是<code>[Int]</code>)。下面是Python代码的音译:</p>
<pre><code>import Control.Monad.ST.Lazy
import Data.Array.ST
import Control.Monad
import Data.List
solveLP :: [Int] -> [[Bool]] -> [[Int]]
solveLP vmax_ elems_ = runST $ do
vmax <- newListArray (0, length vmax_) vmax_
let elems = map (findIndices id) elems_
go vmax elems
go :: STArray s Int Int -> [[Int]] -> ST s [[Int]]
go vmax [] = return [[]]
go vmax (mm:mms) = liftM concat . forM mm $ \ei -> do
maxcnt <- readArray vmax ei
if not (maxcnt > 0) then return [] else do
writeArray vmax ei (maxcnt - 1)
rest <- go vmax mms
writeArray vmax ei maxcnt
return (map (ei:) rest)
</code></pre>
<p>尝试例如<code>solveLP [1,undefined,3] [[True,True,False],[True,False,True]]</code>来查看它是否确实懒洋洋地返回结果。在</p>