2014-10-18 85 views
2

我正在为从k值选择中绘制的n个元素重复排列编写代码。所以我的结果集的基数应该有k^n个元素。在Haskell中,这相当简单。例如,我们可以这样写:将Haskell代码转换为标准ML(与重复组合)

进口Control.Monad(replicateM)

主要= mapM_打印(replicateM 2 [1,2,3])

那么你会得到列表如下:

[1,1] [1,2] [1,3] [2,1] [2,2] [2,3] [3,1] [3,2] [3 ,3]

但在标准ML上,我不知道该怎么做。

我尝试这样做:

乐趣combs_with_rep(K,XXS)=

case (k, xxs) of (0,_) => [[]] 
        |(_, []) => [] 

        |(k, x::xs) =>List.map (fn ys => x::ys) (combs_with_rep((k-1),xxs))@ combs_with_rep(k,xs) 

不过这个名单是不完整的,我不知道为什么....

Haskell中有没有模拟编码做同样的事情?或者我应该如何解决我的sml代码?

任何帮助表示赞赏!

回答

1

刚刚改造一元代码:

rep_comb n xs -- n times choose 1 elem from xs, repetition allowed 
    = replicateM n xs 
    = sequence $ replicate n xs 
    = foldr k (return []) $ replicate n xs 
     where 
      k m m' = do { x <- m; xs <- m'; return (x:xs) } 
    = case n of 0 -> [[]] ; 
       _ -> k xs (rep_comb (n-1) xs) 
     where 
      k m m' = m >>= (\x-> 
        m' >>= (\xs -> return (x:xs))) 
    = case n of 0 -> [[]] ; 
       _ -> xs >>= (\y-> 
        rep_comb (n-1) xs >>= (\ys -> [y:ys])) 
    -- i.e. 
    = case n of 0 -> [[]] ; 
       _ -> [y:ys | y<- xs, ys<- rep_comb (n-1) xs] 
    = case n of 0 -> [[]] ; 
       _ -> concatMap (\y-> map (y:) (rep_comb (n-1) xs)) xs 
    -- or, in a different order 
    = case n of 0 -> [[]] ; 
       _ -> [y:ys | ys<- rep_comb (n-1) xs, y<- xs] 
    = case n of 0 -> [[]] ; 
       _ -> concatMap (\ys-> map (:ys) xs) (rep_comb (n-1) xs) 

现在你可以翻译这ML。