StateTを使ってより簡潔に?
import Control.Monad.State ten = [0..9] getNum :: StateT [Int] [] Int getNum = StateT $ ?ns -> do{n <- ns; return (n, filter (n/=) ns)} sendmory = do s <- getNum if s==0 then lift [] else return () m <- getNum if m==0 then lift [] else return () e <- getNum n <- getNum d <- getNum o <- getNum r <- getNum y <- getNum if s*1000+e*100+n*10+d+m*1000+o*100+r*10+e==m*10000+o*1000+n*100+e*10+y then return (s,e,n,d,m,o,r,y) else lift [] instance (Show s, Show e, Show n, Show d, Show m, Show o, Show r, Show y)=> Show (s,e,n,d,m,o,r,y) where show (s,e,n,d,m,o,r,y) = "("++show s++","++show e++","++show n++","++show d++","++show m++","++show o++","++show r++","++show y++")" main = print (evalStateT sendmory ten)
簡潔になった。しかし、いきなり StateT s [] a とか言われても「は?」という感じは否めない。