a*****e 发帖数: 1700 | 1 我贴一个算24的程序吧(不是我写的),理解了 list monad 的都应该能明白。
make24 :: [Ratio Int] -> Bool
make24 = not . null . filter (==24%1) . ambArith
ambArith :: [Ratio Int] -> [Ratio Int]
ambArith [] = []
ambArith [x] = [x]
ambArith ns = do
let pickOne s = map (x -> (x, delete x s)) s
(x, xs) <- pickOne ns
(y, ys) <- pickOne xs
op <- [(+), (-), (*)] ++ [(/) | y /= 0]
ambArith $ (op x y) : ys
简单改改就可以不仅返回可能性而且输出算式,作为练习题吧。 |
|