module Agari where { import List; type M a = [a]; unitM :: a -> M a; unitM a = [a]; bindM :: M a -> (a -> M b) -> M b; m `bindM` k = case m of { [] -> []; x:xs -> k x ++ (xs `bindM` k) }; failM :: M a; failM = []; pick :: Eq a => [a] -> M a; pick xs = nub xs; remove :: Eq a => a -> [a] -> M [a]; remove x xs = if x `elem` xs then unitM (delete x xs) else failM; shuntsu :: [Int] -> M ([Int], [Int]); shuntsu xs = pick xs `bindM` \ y0 -> remove y0 xs `bindM` \ ys0 -> remove (y0+1) ys0 `bindM` \ ys1 -> remove (y0+2) ys1 `bindM` \ ys2 -> unitM ([y0, y0+1, y0+2], ys2); }