Validando CPF com Haskell
Mar 20th, 2010 by Thiago Galesi
Imagine você trabalhando na sua fábrica de Software CMMI nível 5, altamente motivado em um projeto em Haskell quando surge o desafio de precisar validar um CPF.
(na verdade o cálculo do CPF é bem simples, e tem dois jeitos parecidos, teoria dos números explica)
Então fiz esse lindo módulo incluindo IO copiado e colado perfeitamente estudado.
cpf_digits :: [Integer] -> [Integer]
cpf_digits a = [dv1, dv2]
-- as 3 linhas abaixos devem estar identadas
where
dv1 = calc_vd a
dv2 = calc_vd (drop 1 (a ++ [dv1]))
calc_vd :: [Integer] -> Integer
calc_vd a = mod (foldl (+) 0 (zipWith (*) a [1..9])) 11
check_cpf :: [Integer] -> Bool
check_cpf a = and (zipWith (==) (drop 9 a) (cpf_digits (take 9 a)))
str2list x = map (a -> (read [a] :: Integer)) x
main = do
x <- getLine
let ok = check_cpf (str2list x)
putStrLn $ show ok
Para rodar você precisa ou do Hugs98 ou do GHC
Compila com o GHC e rode
ghc cpf.hs -o cpf
echo '11111111111' | ./cpf
ou com o hugs
echo '11111111111' | runhugs cpf.hs
111.111.111-11 é um CPF válido btw
Edit: Identação fail