send more money

import Control.Monad
import Control.Applicative

digit :: MonadPlus m => m Int
digit = msum $ map return [0..9]

exps :: Num a => [a]
exps = map (10 ^) [0..]

number :: Num a => [a] -> a
number = sum . zipWith (*) exps . reverse

uniqueDigits 0 = return []
uniqueDigits n = do
  xs <- uniqueDigits (n - 1)
  x <- digit
  guard $ x `notElem` xs
  return (x:xs)

sendmoremoney = do
  [s,e,n,d,m,o,r,y] <- uniqueDigits 8
  guard $ s /= 0
  guard $ m /= 0
  guard $ number [s, e, n, d] + number [m, o, r, e] == number [m, o, n, e, y]
  return [s, e, n, d, m, o, r, y]

main = print $ (sendmoremoney :: [[Int]])