-- Produção de Um Recibo Fiscal em um Supermercado
-- Declaração dos tipos de dados
type Nome = String type Preco = Int type CodBar = Int type BaseDeDados = [(CodBar,Nome,Preco)] type ListaDeCodigos = [CodBar] type Recibo = [(Nome,Preco)]
-- função que retorna a lista de produtos cadastrados
-- função que define o tamnho máximo da linha que mostra o nomeProduto........preço
tamLinha :: Int tamLinha = 30
-- Função que retorna o preço em centavos formatado
formataCentavos :: Preco -> String formataCentavos p = real(p) ++ "." ++ cent(p) where -- função que retorna a primeira parte do preço real :: Int -> String real num = show(num `div` 100)
-- função que retorna a segunda parte do preço
cent :: Int -> String cent num = show(num `rem` 100)
-- função para formatar a linha com o nome e o preço do produto
-- função que retorna uma string com a quantidade necessária de caracteres
reparadores -- para a formatação da linha. Essa função tem uso parecido com a "replicate" do Haskell, -- porem ela retorna somente o separador '.' que será usado na lista getSeparator :: Int -> String getSeparator x | x == 0 = "" | x<=2 = " " | otherwise = '.' : getSeparator (x-1)
-- função que retorna o tamanho de uma String
tamStr :: String -> Int tamStr n = length n -- função que retorna o tamanho de um Int tamNum :: Int -> Int tamNum x = length(show(x))
-- função que formata as linhas de produtos do recibo
-- função que faz interface entre o construtor de recibos e a base de dados
achaItem :: CodBar -> (Nome, Preco) achaItem i = acha listaProdutos i
-- função que transforma uma lista de códigos em uma lista (Nome, Preco) fazRecibo :: ListaDeCodigos -> Recibo fazRecibo [] = [] fazRecibo (x:xs) = achaItem(x) : fazRecibo xs