Ir para o conteúdo

Tipos de funções

Agora que já conhecemos alguns tipos, podemos ver como usá-los na definição de funções. Para fazê-lo, devemos usar a seguinte sintaxe, onde o símbolo :: pode ser lido como é do tipo e -> como um separador dos tipos de parâmetros formais e do tipo da saída.

nomeFuncao :: tipo_arg1 -> ... -> tipo_argN -> tipo_saida
nomeFuncao arg1 ... argN = <definicao>

Por exemplo, o protótipo da função diaMes, isto é, a definição dos tipos de entrada e saída da função, fica assim:

diasMes :: Int -> Int
diasMes m
    | m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12 = 31
    | m == 2 = 28
    | otherwise = 30

Esta definição pode então ser lida como "a função diasMes é do tipo que recebe um inteiro como entrada e retorna um inteiro como saída.

Já uma função que calcula a média de três números reais terá a seguinte definição, incluindo o protótipo

m3n :: Float -> Float -> Float -> Float
m3n a b c = (a + b + c)/2

Exercícios

  • Defina o protótipo da função de conversão de Fahrenheit para Celsius f2c x = (x - 32) /1.8
  • Descubra a quanto 100f corresponde em Célsius
Resolução
f2c :: Float -> Float
f2c x = (x - 32) /1.8
  • Defina o protótipo da soma de dois números inteiros soma2int a b = a + b
  • Aplique a função aos valores 2 e 3.
  • Aplique a função aos valores 2.0 e 3.0.
Resolução
soma2int :: Int -> Int -> Int
soma2int a b = a + b
  • Aplique a função aos valores 2.0 e 3.0.
  • Aplique a função aos valores 2 e 3.

  • Defina o protótipo da soma de dois números reais soma2reais a b = a + b

Resolução
soma2reais :: Float -> Float -> Float
  • Explique a diferença de comportamento das duas últimas invocações.
Resolução

As funções se comportam diferentemente, sendo que a primeira mostra um erro quando aplicada a dois números reais, porquê \(Z \subset R\) mas \(R \not\subset Z\).