前回のN-Queens問題につづいてlist monadを利用して関数型言語のHaskellで完全順列を生成するコードを書いてみましょう。
*Main> derangement ['c','o','n','s'] >>["ocsn","onsc","oscn","ncso","nsco","nsoc","scon","snco","snoc"]こんな感じになって欲しいのです。順列を生成した後にfilterを掛けるのは非効率的なのでやめておきます。
書いてみると以下のようになりました。
import Data.List derangement xs = drg xs xs drg [] ys = return [] drg xs (y:ys) = delete y xs >>= \x -> map (x:) (drg (delete x xs) ys)
Monadを利用することを考えると、こんなに簡単に書けるんですね。
素晴らしきかな、Haskell、Monad!
0 件のコメント:
コメントを投稿