Concurrent Clean : shuffled_perm

shuffled_permがきちんとshuffleするように修正してみた。

shuffled_perm _ [] _ = [[]]
shuffled_perm frnd ls s # (ls,rnd) = shuffle ls (frnd s)
                          (slst,rnd) = map_shuffle [] ls rnd
                          arr = asArray {a \\ a <- slst}
                          (n,arr) = usize arr
                        = loop n arr rnd
  where
    map_shuffle _ [] rnd = ([],rnd)
    map_shuffle ls1 [a:ls2] [s:r] # (rest,rnd) = map_shuffle [a:ls1] ls2 r
                                  = ([(a,shuffled_perm frnd (ls1++ls2) s):rest], rnd)

    loop 0 _ _ = []
    loop n arr [s:r] # ((fr,to),arr) = arr![i]
                     = case to of
                        [] = loop n_1 (swap i n_1 arr) r
                        [h:t] # arr = {arr & [i]=(fr,t)}
                              = [[fr:h]:loop n arr r]
      where
        i = (abs s) rem n
        n_1 = dec n

やはり、適切に枝刈りを入れていかないと、現実的な解にはなりそうもない。