リストモナドの練習

揺動散逸日記 萌えるモナド講座その1を見ながら、「各桁の和の11倍と等しい三桁の整数」を実際に動かして求めてみました。answersでは、a、b、cの組合せの内から条件にマッチするもののみ返します。

module Main (main) where

import Control.Monad (guard)

answers :: [] Int
answers = do
  a <- [1..9]
  b <- [0..9]
  c <- [0..9]
  let n = a * 100 + b * 10 + c
  guard $ n == (a + b + c) * 11
  return n

main :: IO ()
main = print answers -- => [198]

確かにモナドは萌えます。表面的にはひかえめなんだけど、いろいろ裏でよきようにはからってくれるあたりとか。
参照: