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
やはり、適切に枝刈りを入れていかないと、現実的な解にはなりそうもない。