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]])