114
1/66 Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2013.1

Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

1/66

Programação Funcional

Capítulo 6

Casamento de Padrão

José Romildo Malaquias

Departamento de ComputaçãoUniversidade Federal de Ouro Preto

2013.1

Page 2: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

2/66

1 Casamento de padrão

2 Expressão case

3 Definição de função usando padrões

4 Definições locais

Page 3: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

3/66

Tópicos

1 Casamento de padrão

2 Expressão case

3 Definição de função usando padrões

4 Definições locais

Page 4: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

4/66

Casamento de padrão

Padrão é uma construção da linguagem de programação que permite analisarum valor e associar variáveis aos componentes do valor.

Casamento de padrão é uma operação envolvendo um padrão e uma expressãoque faz a correspondência (casamento) entre o padrão e o valor da expressão.

O casamento de padrão pode suceder ou falhar, dependendo da forma do padrãoe da expressão envolvidos.

Quando o casamento de padrão sucede as variáveis que ocorrem no padrão sãoassociadas aos componentes correspondentes do valor.

Em um casamento de padrão, o padrão e a expressão devem ser do mesmo tipo.

Existem várias formas de padrão. Na seqüência algumas delas serãoapresentadas.

Page 5: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

5/66

Padrão constante

O padrão constante é simplesmente uma constante.

O casamento sucede se e somente se o padrão for idêntico ao valor.

Exemplos:

padrão valor casamento

10 10 X10 28 ×10 ’P’ erro de tipo’P’ ’P’ X’P’ ’q’ ×’P’ True erro de tipoTrue True XTrue False ×True 65 erro de tipo

X: sucede×: falha

Page 6: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

5/66

Padrão constante

O padrão constante é simplesmente uma constante.

O casamento sucede se e somente se o padrão for idêntico ao valor.

Exemplos:

padrão valor casamento

10 10 X10 28 ×10 ’P’ erro de tipo’P’ ’P’ X’P’ ’q’ ×’P’ True erro de tipoTrue True XTrue False ×True 65 erro de tipo

X: sucede×: falha

Page 7: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

5/66

Padrão constante

O padrão constante é simplesmente uma constante.

O casamento sucede se e somente se o padrão for idêntico ao valor.

Exemplos:

padrão valor casamento

10 10 X10 28 ×10 ’P’ erro de tipo’P’ ’P’ X’P’ ’q’ ×’P’ True erro de tipoTrue True XTrue False ×True 65 erro de tipo

X: sucede×: falha

Page 8: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

5/66

Padrão constante

O padrão constante é simplesmente uma constante.

O casamento sucede se e somente se o padrão for idêntico ao valor.

Exemplos:

padrão valor casamento10 10 X

10 28 ×10 ’P’ erro de tipo’P’ ’P’ X’P’ ’q’ ×’P’ True erro de tipoTrue True XTrue False ×True 65 erro de tipo

X: sucede×: falha

Page 9: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

5/66

Padrão constante

O padrão constante é simplesmente uma constante.

O casamento sucede se e somente se o padrão for idêntico ao valor.

Exemplos:

padrão valor casamento10 10 X10 28 ×

10 ’P’ erro de tipo’P’ ’P’ X’P’ ’q’ ×’P’ True erro de tipoTrue True XTrue False ×True 65 erro de tipo

X: sucede×: falha

Page 10: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

5/66

Padrão constante

O padrão constante é simplesmente uma constante.

O casamento sucede se e somente se o padrão for idêntico ao valor.

Exemplos:

padrão valor casamento10 10 X10 28 ×10 ’P’ erro de tipo

’P’ ’P’ X’P’ ’q’ ×’P’ True erro de tipoTrue True XTrue False ×True 65 erro de tipo

X: sucede×: falha

Page 11: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

5/66

Padrão constante

O padrão constante é simplesmente uma constante.

O casamento sucede se e somente se o padrão for idêntico ao valor.

Exemplos:

padrão valor casamento10 10 X10 28 ×10 ’P’ erro de tipo’P’ ’P’ X

’P’ ’q’ ×’P’ True erro de tipoTrue True XTrue False ×True 65 erro de tipo

X: sucede×: falha

Page 12: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

5/66

Padrão constante

O padrão constante é simplesmente uma constante.

O casamento sucede se e somente se o padrão for idêntico ao valor.

Exemplos:

padrão valor casamento10 10 X10 28 ×10 ’P’ erro de tipo’P’ ’P’ X’P’ ’q’ ×

’P’ True erro de tipoTrue True XTrue False ×True 65 erro de tipo

X: sucede×: falha

Page 13: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

5/66

Padrão constante

O padrão constante é simplesmente uma constante.

O casamento sucede se e somente se o padrão for idêntico ao valor.

Exemplos:

padrão valor casamento10 10 X10 28 ×10 ’P’ erro de tipo’P’ ’P’ X’P’ ’q’ ×’P’ True erro de tipo

True True XTrue False ×True 65 erro de tipo

X: sucede×: falha

Page 14: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

5/66

Padrão constante

O padrão constante é simplesmente uma constante.

O casamento sucede se e somente se o padrão for idêntico ao valor.

Exemplos:

padrão valor casamento10 10 X10 28 ×10 ’P’ erro de tipo’P’ ’P’ X’P’ ’q’ ×’P’ True erro de tipoTrue True X

True False ×True 65 erro de tipo

X: sucede×: falha

Page 15: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

5/66

Padrão constante

O padrão constante é simplesmente uma constante.

O casamento sucede se e somente se o padrão for idêntico ao valor.

Exemplos:

padrão valor casamento10 10 X10 28 ×10 ’P’ erro de tipo’P’ ’P’ X’P’ ’q’ ×’P’ True erro de tipoTrue True XTrue False ×

True 65 erro de tipoX: sucede×: falha

Page 16: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

5/66

Padrão constante

O padrão constante é simplesmente uma constante.

O casamento sucede se e somente se o padrão for idêntico ao valor.

Exemplos:

padrão valor casamento10 10 X10 28 ×10 ’P’ erro de tipo’P’ ’P’ X’P’ ’q’ ×’P’ True erro de tipoTrue True XTrue False ×True 65 erro de tipo

X: sucede×: falha

Page 17: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

6/66

Padrão variável

O padrão variável é simplesmente um identificador de variável de valor (e comotal deve começar com letra minúscula).

O casamento sucede sempre.

A variável é associada ao valor.

Exemplos:

padrão valor casamento

x 10 Xx 7→ 10alfa 563.1223 Xalfa 7→ 563.1223letra ’K’ Xletra 7→ ’K’nomeCliente "Ana Maria" XnomeCliente 7→ "Ana Maria"pessoa ("Ana",’F’,16) Xpessoa 7→ ("Ana",’F’,16)notas [5.6,7.1,9.0] Xnotas 7→ [5.6,7.1,9.0]

Page 18: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

6/66

Padrão variável

O padrão variável é simplesmente um identificador de variável de valor (e comotal deve começar com letra minúscula).

O casamento sucede sempre.

A variável é associada ao valor.

Exemplos:

padrão valor casamento

x 10 Xx 7→ 10alfa 563.1223 Xalfa 7→ 563.1223letra ’K’ Xletra 7→ ’K’nomeCliente "Ana Maria" XnomeCliente 7→ "Ana Maria"pessoa ("Ana",’F’,16) Xpessoa 7→ ("Ana",’F’,16)notas [5.6,7.1,9.0] Xnotas 7→ [5.6,7.1,9.0]

Page 19: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

6/66

Padrão variável

O padrão variável é simplesmente um identificador de variável de valor (e comotal deve começar com letra minúscula).

O casamento sucede sempre.

A variável é associada ao valor.

Exemplos:

padrão valor casamento

x 10 Xx 7→ 10alfa 563.1223 Xalfa 7→ 563.1223letra ’K’ Xletra 7→ ’K’nomeCliente "Ana Maria" XnomeCliente 7→ "Ana Maria"pessoa ("Ana",’F’,16) Xpessoa 7→ ("Ana",’F’,16)notas [5.6,7.1,9.0] Xnotas 7→ [5.6,7.1,9.0]

Page 20: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

6/66

Padrão variável

O padrão variável é simplesmente um identificador de variável de valor (e comotal deve começar com letra minúscula).

O casamento sucede sempre.

A variável é associada ao valor.

Exemplos:

padrão valor casamento

x 10 Xx 7→ 10alfa 563.1223 Xalfa 7→ 563.1223letra ’K’ Xletra 7→ ’K’nomeCliente "Ana Maria" XnomeCliente 7→ "Ana Maria"pessoa ("Ana",’F’,16) Xpessoa 7→ ("Ana",’F’,16)notas [5.6,7.1,9.0] Xnotas 7→ [5.6,7.1,9.0]

Page 21: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

6/66

Padrão variável

O padrão variável é simplesmente um identificador de variável de valor (e comotal deve começar com letra minúscula).

O casamento sucede sempre.

A variável é associada ao valor.

Exemplos:

padrão valor casamentox 10 Xx 7→ 10

alfa 563.1223 Xalfa 7→ 563.1223letra ’K’ Xletra 7→ ’K’nomeCliente "Ana Maria" XnomeCliente 7→ "Ana Maria"pessoa ("Ana",’F’,16) Xpessoa 7→ ("Ana",’F’,16)notas [5.6,7.1,9.0] Xnotas 7→ [5.6,7.1,9.0]

Page 22: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

6/66

Padrão variável

O padrão variável é simplesmente um identificador de variável de valor (e comotal deve começar com letra minúscula).

O casamento sucede sempre.

A variável é associada ao valor.

Exemplos:

padrão valor casamentox 10 Xx 7→ 10alfa 563.1223 Xalfa 7→ 563.1223

letra ’K’ Xletra 7→ ’K’nomeCliente "Ana Maria" XnomeCliente 7→ "Ana Maria"pessoa ("Ana",’F’,16) Xpessoa 7→ ("Ana",’F’,16)notas [5.6,7.1,9.0] Xnotas 7→ [5.6,7.1,9.0]

Page 23: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

6/66

Padrão variável

O padrão variável é simplesmente um identificador de variável de valor (e comotal deve começar com letra minúscula).

O casamento sucede sempre.

A variável é associada ao valor.

Exemplos:

padrão valor casamentox 10 Xx 7→ 10alfa 563.1223 Xalfa 7→ 563.1223letra ’K’ Xletra 7→ ’K’

nomeCliente "Ana Maria" XnomeCliente 7→ "Ana Maria"pessoa ("Ana",’F’,16) Xpessoa 7→ ("Ana",’F’,16)notas [5.6,7.1,9.0] Xnotas 7→ [5.6,7.1,9.0]

Page 24: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

6/66

Padrão variável

O padrão variável é simplesmente um identificador de variável de valor (e comotal deve começar com letra minúscula).

O casamento sucede sempre.

A variável é associada ao valor.

Exemplos:

padrão valor casamentox 10 Xx 7→ 10alfa 563.1223 Xalfa 7→ 563.1223letra ’K’ Xletra 7→ ’K’nomeCliente "Ana Maria" XnomeCliente 7→ "Ana Maria"

pessoa ("Ana",’F’,16) Xpessoa 7→ ("Ana",’F’,16)notas [5.6,7.1,9.0] Xnotas 7→ [5.6,7.1,9.0]

Page 25: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

6/66

Padrão variável

O padrão variável é simplesmente um identificador de variável de valor (e comotal deve começar com letra minúscula).

O casamento sucede sempre.

A variável é associada ao valor.

Exemplos:

padrão valor casamentox 10 Xx 7→ 10alfa 563.1223 Xalfa 7→ 563.1223letra ’K’ Xletra 7→ ’K’nomeCliente "Ana Maria" XnomeCliente 7→ "Ana Maria"pessoa ("Ana",’F’,16) Xpessoa 7→ ("Ana",’F’,16)

notas [5.6,7.1,9.0] Xnotas 7→ [5.6,7.1,9.0]

Page 26: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

6/66

Padrão variável

O padrão variável é simplesmente um identificador de variável de valor (e comotal deve começar com letra minúscula).

O casamento sucede sempre.

A variável é associada ao valor.

Exemplos:

padrão valor casamentox 10 Xx 7→ 10alfa 563.1223 Xalfa 7→ 563.1223letra ’K’ Xletra 7→ ’K’nomeCliente "Ana Maria" XnomeCliente 7→ "Ana Maria"pessoa ("Ana",’F’,16) Xpessoa 7→ ("Ana",’F’,16)notas [5.6,7.1,9.0] Xnotas 7→ [5.6,7.1,9.0]

Page 27: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

7/66

Padrão curinga

O padrão curinga é escrito como um sublinhado (_).

O casamento sucede sempre.

Nenhuma associação de variável é produzida.

_ é também chamado de variável anônima, pois casa com qualquer valor semdar nome ao valor.

Exemplos:

padrão valor casamento

_ 10 X_ 28 X_ ’P’ X_ () X_ (18,3,2012) X_ "Ana Maria" X_ [5.6,7.1,9.0] X

Page 28: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

7/66

Padrão curinga

O padrão curinga é escrito como um sublinhado (_).

O casamento sucede sempre.

Nenhuma associação de variável é produzida.

_ é também chamado de variável anônima, pois casa com qualquer valor semdar nome ao valor.

Exemplos:

padrão valor casamento

_ 10 X_ 28 X_ ’P’ X_ () X_ (18,3,2012) X_ "Ana Maria" X_ [5.6,7.1,9.0] X

Page 29: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

7/66

Padrão curinga

O padrão curinga é escrito como um sublinhado (_).

O casamento sucede sempre.

Nenhuma associação de variável é produzida.

_ é também chamado de variável anônima, pois casa com qualquer valor semdar nome ao valor.

Exemplos:

padrão valor casamento

_ 10 X_ 28 X_ ’P’ X_ () X_ (18,3,2012) X_ "Ana Maria" X_ [5.6,7.1,9.0] X

Page 30: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

7/66

Padrão curinga

O padrão curinga é escrito como um sublinhado (_).

O casamento sucede sempre.

Nenhuma associação de variável é produzida.

_ é também chamado de variável anônima, pois casa com qualquer valor semdar nome ao valor.

Exemplos:

padrão valor casamento

_ 10 X_ 28 X_ ’P’ X_ () X_ (18,3,2012) X_ "Ana Maria" X_ [5.6,7.1,9.0] X

Page 31: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

7/66

Padrão curinga

O padrão curinga é escrito como um sublinhado (_).

O casamento sucede sempre.

Nenhuma associação de variável é produzida.

_ é também chamado de variável anônima, pois casa com qualquer valor semdar nome ao valor.

Exemplos:

padrão valor casamento

_ 10 X_ 28 X_ ’P’ X_ () X_ (18,3,2012) X_ "Ana Maria" X_ [5.6,7.1,9.0] X

Page 32: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

7/66

Padrão curinga

O padrão curinga é escrito como um sublinhado (_).

O casamento sucede sempre.

Nenhuma associação de variável é produzida.

_ é também chamado de variável anônima, pois casa com qualquer valor semdar nome ao valor.

Exemplos:

padrão valor casamento_ 10 X

_ 28 X_ ’P’ X_ () X_ (18,3,2012) X_ "Ana Maria" X_ [5.6,7.1,9.0] X

Page 33: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

7/66

Padrão curinga

O padrão curinga é escrito como um sublinhado (_).

O casamento sucede sempre.

Nenhuma associação de variável é produzida.

_ é também chamado de variável anônima, pois casa com qualquer valor semdar nome ao valor.

Exemplos:

padrão valor casamento_ 10 X_ 28 X

_ ’P’ X_ () X_ (18,3,2012) X_ "Ana Maria" X_ [5.6,7.1,9.0] X

Page 34: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

7/66

Padrão curinga

O padrão curinga é escrito como um sublinhado (_).

O casamento sucede sempre.

Nenhuma associação de variável é produzida.

_ é também chamado de variável anônima, pois casa com qualquer valor semdar nome ao valor.

Exemplos:

padrão valor casamento_ 10 X_ 28 X_ ’P’ X

_ () X_ (18,3,2012) X_ "Ana Maria" X_ [5.6,7.1,9.0] X

Page 35: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

7/66

Padrão curinga

O padrão curinga é escrito como um sublinhado (_).

O casamento sucede sempre.

Nenhuma associação de variável é produzida.

_ é também chamado de variável anônima, pois casa com qualquer valor semdar nome ao valor.

Exemplos:

padrão valor casamento_ 10 X_ 28 X_ ’P’ X_ () X

_ (18,3,2012) X_ "Ana Maria" X_ [5.6,7.1,9.0] X

Page 36: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

7/66

Padrão curinga

O padrão curinga é escrito como um sublinhado (_).

O casamento sucede sempre.

Nenhuma associação de variável é produzida.

_ é também chamado de variável anônima, pois casa com qualquer valor semdar nome ao valor.

Exemplos:

padrão valor casamento_ 10 X_ 28 X_ ’P’ X_ () X_ (18,3,2012) X

_ "Ana Maria" X_ [5.6,7.1,9.0] X

Page 37: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

7/66

Padrão curinga

O padrão curinga é escrito como um sublinhado (_).

O casamento sucede sempre.

Nenhuma associação de variável é produzida.

_ é também chamado de variável anônima, pois casa com qualquer valor semdar nome ao valor.

Exemplos:

padrão valor casamento_ 10 X_ 28 X_ ’P’ X_ () X_ (18,3,2012) X_ "Ana Maria" X

_ [5.6,7.1,9.0] X

Page 38: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

7/66

Padrão curinga

O padrão curinga é escrito como um sublinhado (_).

O casamento sucede sempre.

Nenhuma associação de variável é produzida.

_ é também chamado de variável anônima, pois casa com qualquer valor semdar nome ao valor.

Exemplos:

padrão valor casamento_ 10 X_ 28 X_ ’P’ X_ () X_ (18,3,2012) X_ "Ana Maria" X_ [5.6,7.1,9.0] X

Page 39: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

8/66

Padrão tupla

Uma tupla de padrões também é um padrão

( padrao1, . . ., padraon )

O casamento sucede se e somente se cada um dos padrões casar com ocomponente correspondente do valor.

Se as aridades do padrão tupla e do valor tupla forem diferentes, então ocorre umerro de tipo.

Page 40: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

8/66

Padrão tupla

Uma tupla de padrões também é um padrão

( padrao1, . . ., padraon )

O casamento sucede se e somente se cada um dos padrões casar com ocomponente correspondente do valor.

Se as aridades do padrão tupla e do valor tupla forem diferentes, então ocorre umerro de tipo.

Page 41: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

8/66

Padrão tupla

Uma tupla de padrões também é um padrão

( padrao1, . . ., padraon )

O casamento sucede se e somente se cada um dos padrões casar com ocomponente correspondente do valor.

Se as aridades do padrão tupla e do valor tupla forem diferentes, então ocorre umerro de tipo.

Page 42: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

9/66

Padrão tupla

Exemplos:

padrão valor casamento

(18,True) (18,True) X(97,True) (18,True) ×(18,False) (18,True) ×(18,’M’) (18,True) erro de tipo(18,True,’M’) (18,True) erro de tipo() () X(x,y) (5,9) Xx 7→ 5, y 7→ 9(d,_,a) (5,9,2012) Xd 7→ 5, a 7→ 2012(x,y,z) (5,9) erro de tipo(18,m,a) (18,3,2012) Xm 7→ 3, a 7→ 2012(d,5,a) (18,3,2012) ×(nome,sexo,_) ("Ana",’F’,18) Xnome 7→ "Ana", sexo 7→ ’F’(_,_,idade) ("Ana",’F’,18) Xidade 7→ 18(_,(_,fam),9) (’F’,("Ana","Dias"),9) Xfam 7→ "Dias"(_,(_,fam),5) (’F’,("Ana","Dias"),9) ×

Page 43: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

9/66

Padrão tupla

Exemplos:

padrão valor casamento(18,True) (18,True) X

(97,True) (18,True) ×(18,False) (18,True) ×(18,’M’) (18,True) erro de tipo(18,True,’M’) (18,True) erro de tipo() () X(x,y) (5,9) Xx 7→ 5, y 7→ 9(d,_,a) (5,9,2012) Xd 7→ 5, a 7→ 2012(x,y,z) (5,9) erro de tipo(18,m,a) (18,3,2012) Xm 7→ 3, a 7→ 2012(d,5,a) (18,3,2012) ×(nome,sexo,_) ("Ana",’F’,18) Xnome 7→ "Ana", sexo 7→ ’F’(_,_,idade) ("Ana",’F’,18) Xidade 7→ 18(_,(_,fam),9) (’F’,("Ana","Dias"),9) Xfam 7→ "Dias"(_,(_,fam),5) (’F’,("Ana","Dias"),9) ×

Page 44: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

9/66

Padrão tupla

Exemplos:

padrão valor casamento(18,True) (18,True) X(97,True) (18,True) ×

(18,False) (18,True) ×(18,’M’) (18,True) erro de tipo(18,True,’M’) (18,True) erro de tipo() () X(x,y) (5,9) Xx 7→ 5, y 7→ 9(d,_,a) (5,9,2012) Xd 7→ 5, a 7→ 2012(x,y,z) (5,9) erro de tipo(18,m,a) (18,3,2012) Xm 7→ 3, a 7→ 2012(d,5,a) (18,3,2012) ×(nome,sexo,_) ("Ana",’F’,18) Xnome 7→ "Ana", sexo 7→ ’F’(_,_,idade) ("Ana",’F’,18) Xidade 7→ 18(_,(_,fam),9) (’F’,("Ana","Dias"),9) Xfam 7→ "Dias"(_,(_,fam),5) (’F’,("Ana","Dias"),9) ×

Page 45: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

9/66

Padrão tupla

Exemplos:

padrão valor casamento(18,True) (18,True) X(97,True) (18,True) ×(18,False) (18,True) ×

(18,’M’) (18,True) erro de tipo(18,True,’M’) (18,True) erro de tipo() () X(x,y) (5,9) Xx 7→ 5, y 7→ 9(d,_,a) (5,9,2012) Xd 7→ 5, a 7→ 2012(x,y,z) (5,9) erro de tipo(18,m,a) (18,3,2012) Xm 7→ 3, a 7→ 2012(d,5,a) (18,3,2012) ×(nome,sexo,_) ("Ana",’F’,18) Xnome 7→ "Ana", sexo 7→ ’F’(_,_,idade) ("Ana",’F’,18) Xidade 7→ 18(_,(_,fam),9) (’F’,("Ana","Dias"),9) Xfam 7→ "Dias"(_,(_,fam),5) (’F’,("Ana","Dias"),9) ×

Page 46: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

9/66

Padrão tupla

Exemplos:

padrão valor casamento(18,True) (18,True) X(97,True) (18,True) ×(18,False) (18,True) ×(18,’M’) (18,True) erro de tipo

(18,True,’M’) (18,True) erro de tipo() () X(x,y) (5,9) Xx 7→ 5, y 7→ 9(d,_,a) (5,9,2012) Xd 7→ 5, a 7→ 2012(x,y,z) (5,9) erro de tipo(18,m,a) (18,3,2012) Xm 7→ 3, a 7→ 2012(d,5,a) (18,3,2012) ×(nome,sexo,_) ("Ana",’F’,18) Xnome 7→ "Ana", sexo 7→ ’F’(_,_,idade) ("Ana",’F’,18) Xidade 7→ 18(_,(_,fam),9) (’F’,("Ana","Dias"),9) Xfam 7→ "Dias"(_,(_,fam),5) (’F’,("Ana","Dias"),9) ×

Page 47: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

9/66

Padrão tupla

Exemplos:

padrão valor casamento(18,True) (18,True) X(97,True) (18,True) ×(18,False) (18,True) ×(18,’M’) (18,True) erro de tipo(18,True,’M’) (18,True) erro de tipo

() () X(x,y) (5,9) Xx 7→ 5, y 7→ 9(d,_,a) (5,9,2012) Xd 7→ 5, a 7→ 2012(x,y,z) (5,9) erro de tipo(18,m,a) (18,3,2012) Xm 7→ 3, a 7→ 2012(d,5,a) (18,3,2012) ×(nome,sexo,_) ("Ana",’F’,18) Xnome 7→ "Ana", sexo 7→ ’F’(_,_,idade) ("Ana",’F’,18) Xidade 7→ 18(_,(_,fam),9) (’F’,("Ana","Dias"),9) Xfam 7→ "Dias"(_,(_,fam),5) (’F’,("Ana","Dias"),9) ×

Page 48: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

9/66

Padrão tupla

Exemplos:

padrão valor casamento(18,True) (18,True) X(97,True) (18,True) ×(18,False) (18,True) ×(18,’M’) (18,True) erro de tipo(18,True,’M’) (18,True) erro de tipo() () X

(x,y) (5,9) Xx 7→ 5, y 7→ 9(d,_,a) (5,9,2012) Xd 7→ 5, a 7→ 2012(x,y,z) (5,9) erro de tipo(18,m,a) (18,3,2012) Xm 7→ 3, a 7→ 2012(d,5,a) (18,3,2012) ×(nome,sexo,_) ("Ana",’F’,18) Xnome 7→ "Ana", sexo 7→ ’F’(_,_,idade) ("Ana",’F’,18) Xidade 7→ 18(_,(_,fam),9) (’F’,("Ana","Dias"),9) Xfam 7→ "Dias"(_,(_,fam),5) (’F’,("Ana","Dias"),9) ×

Page 49: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

9/66

Padrão tupla

Exemplos:

padrão valor casamento(18,True) (18,True) X(97,True) (18,True) ×(18,False) (18,True) ×(18,’M’) (18,True) erro de tipo(18,True,’M’) (18,True) erro de tipo() () X(x,y) (5,9) Xx 7→ 5, y 7→ 9

(d,_,a) (5,9,2012) Xd 7→ 5, a 7→ 2012(x,y,z) (5,9) erro de tipo(18,m,a) (18,3,2012) Xm 7→ 3, a 7→ 2012(d,5,a) (18,3,2012) ×(nome,sexo,_) ("Ana",’F’,18) Xnome 7→ "Ana", sexo 7→ ’F’(_,_,idade) ("Ana",’F’,18) Xidade 7→ 18(_,(_,fam),9) (’F’,("Ana","Dias"),9) Xfam 7→ "Dias"(_,(_,fam),5) (’F’,("Ana","Dias"),9) ×

Page 50: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

9/66

Padrão tupla

Exemplos:

padrão valor casamento(18,True) (18,True) X(97,True) (18,True) ×(18,False) (18,True) ×(18,’M’) (18,True) erro de tipo(18,True,’M’) (18,True) erro de tipo() () X(x,y) (5,9) Xx 7→ 5, y 7→ 9(d,_,a) (5,9,2012) Xd 7→ 5, a 7→ 2012

(x,y,z) (5,9) erro de tipo(18,m,a) (18,3,2012) Xm 7→ 3, a 7→ 2012(d,5,a) (18,3,2012) ×(nome,sexo,_) ("Ana",’F’,18) Xnome 7→ "Ana", sexo 7→ ’F’(_,_,idade) ("Ana",’F’,18) Xidade 7→ 18(_,(_,fam),9) (’F’,("Ana","Dias"),9) Xfam 7→ "Dias"(_,(_,fam),5) (’F’,("Ana","Dias"),9) ×

Page 51: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

9/66

Padrão tupla

Exemplos:

padrão valor casamento(18,True) (18,True) X(97,True) (18,True) ×(18,False) (18,True) ×(18,’M’) (18,True) erro de tipo(18,True,’M’) (18,True) erro de tipo() () X(x,y) (5,9) Xx 7→ 5, y 7→ 9(d,_,a) (5,9,2012) Xd 7→ 5, a 7→ 2012(x,y,z) (5,9) erro de tipo

(18,m,a) (18,3,2012) Xm 7→ 3, a 7→ 2012(d,5,a) (18,3,2012) ×(nome,sexo,_) ("Ana",’F’,18) Xnome 7→ "Ana", sexo 7→ ’F’(_,_,idade) ("Ana",’F’,18) Xidade 7→ 18(_,(_,fam),9) (’F’,("Ana","Dias"),9) Xfam 7→ "Dias"(_,(_,fam),5) (’F’,("Ana","Dias"),9) ×

Page 52: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

9/66

Padrão tupla

Exemplos:

padrão valor casamento(18,True) (18,True) X(97,True) (18,True) ×(18,False) (18,True) ×(18,’M’) (18,True) erro de tipo(18,True,’M’) (18,True) erro de tipo() () X(x,y) (5,9) Xx 7→ 5, y 7→ 9(d,_,a) (5,9,2012) Xd 7→ 5, a 7→ 2012(x,y,z) (5,9) erro de tipo(18,m,a) (18,3,2012) Xm 7→ 3, a 7→ 2012

(d,5,a) (18,3,2012) ×(nome,sexo,_) ("Ana",’F’,18) Xnome 7→ "Ana", sexo 7→ ’F’(_,_,idade) ("Ana",’F’,18) Xidade 7→ 18(_,(_,fam),9) (’F’,("Ana","Dias"),9) Xfam 7→ "Dias"(_,(_,fam),5) (’F’,("Ana","Dias"),9) ×

Page 53: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

9/66

Padrão tupla

Exemplos:

padrão valor casamento(18,True) (18,True) X(97,True) (18,True) ×(18,False) (18,True) ×(18,’M’) (18,True) erro de tipo(18,True,’M’) (18,True) erro de tipo() () X(x,y) (5,9) Xx 7→ 5, y 7→ 9(d,_,a) (5,9,2012) Xd 7→ 5, a 7→ 2012(x,y,z) (5,9) erro de tipo(18,m,a) (18,3,2012) Xm 7→ 3, a 7→ 2012(d,5,a) (18,3,2012) ×

(nome,sexo,_) ("Ana",’F’,18) Xnome 7→ "Ana", sexo 7→ ’F’(_,_,idade) ("Ana",’F’,18) Xidade 7→ 18(_,(_,fam),9) (’F’,("Ana","Dias"),9) Xfam 7→ "Dias"(_,(_,fam),5) (’F’,("Ana","Dias"),9) ×

Page 54: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

9/66

Padrão tupla

Exemplos:

padrão valor casamento(18,True) (18,True) X(97,True) (18,True) ×(18,False) (18,True) ×(18,’M’) (18,True) erro de tipo(18,True,’M’) (18,True) erro de tipo() () X(x,y) (5,9) Xx 7→ 5, y 7→ 9(d,_,a) (5,9,2012) Xd 7→ 5, a 7→ 2012(x,y,z) (5,9) erro de tipo(18,m,a) (18,3,2012) Xm 7→ 3, a 7→ 2012(d,5,a) (18,3,2012) ×(nome,sexo,_) ("Ana",’F’,18) Xnome 7→ "Ana", sexo 7→ ’F’

(_,_,idade) ("Ana",’F’,18) Xidade 7→ 18(_,(_,fam),9) (’F’,("Ana","Dias"),9) Xfam 7→ "Dias"(_,(_,fam),5) (’F’,("Ana","Dias"),9) ×

Page 55: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

9/66

Padrão tupla

Exemplos:

padrão valor casamento(18,True) (18,True) X(97,True) (18,True) ×(18,False) (18,True) ×(18,’M’) (18,True) erro de tipo(18,True,’M’) (18,True) erro de tipo() () X(x,y) (5,9) Xx 7→ 5, y 7→ 9(d,_,a) (5,9,2012) Xd 7→ 5, a 7→ 2012(x,y,z) (5,9) erro de tipo(18,m,a) (18,3,2012) Xm 7→ 3, a 7→ 2012(d,5,a) (18,3,2012) ×(nome,sexo,_) ("Ana",’F’,18) Xnome 7→ "Ana", sexo 7→ ’F’(_,_,idade) ("Ana",’F’,18) Xidade 7→ 18

(_,(_,fam),9) (’F’,("Ana","Dias"),9) Xfam 7→ "Dias"(_,(_,fam),5) (’F’,("Ana","Dias"),9) ×

Page 56: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

9/66

Padrão tupla

Exemplos:

padrão valor casamento(18,True) (18,True) X(97,True) (18,True) ×(18,False) (18,True) ×(18,’M’) (18,True) erro de tipo(18,True,’M’) (18,True) erro de tipo() () X(x,y) (5,9) Xx 7→ 5, y 7→ 9(d,_,a) (5,9,2012) Xd 7→ 5, a 7→ 2012(x,y,z) (5,9) erro de tipo(18,m,a) (18,3,2012) Xm 7→ 3, a 7→ 2012(d,5,a) (18,3,2012) ×(nome,sexo,_) ("Ana",’F’,18) Xnome 7→ "Ana", sexo 7→ ’F’(_,_,idade) ("Ana",’F’,18) Xidade 7→ 18(_,(_,fam),9) (’F’,("Ana","Dias"),9) Xfam 7→ "Dias"

(_,(_,fam),5) (’F’,("Ana","Dias"),9) ×

Page 57: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

9/66

Padrão tupla

Exemplos:

padrão valor casamento(18,True) (18,True) X(97,True) (18,True) ×(18,False) (18,True) ×(18,’M’) (18,True) erro de tipo(18,True,’M’) (18,True) erro de tipo() () X(x,y) (5,9) Xx 7→ 5, y 7→ 9(d,_,a) (5,9,2012) Xd 7→ 5, a 7→ 2012(x,y,z) (5,9) erro de tipo(18,m,a) (18,3,2012) Xm 7→ 3, a 7→ 2012(d,5,a) (18,3,2012) ×(nome,sexo,_) ("Ana",’F’,18) Xnome 7→ "Ana", sexo 7→ ’F’(_,_,idade) ("Ana",’F’,18) Xidade 7→ 18(_,(_,fam),9) (’F’,("Ana","Dias"),9) Xfam 7→ "Dias"(_,(_,fam),5) (’F’,("Ana","Dias"),9) ×

Page 58: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

10/66

Tópicos

1 Casamento de padrão

2 Expressão case

3 Definição de função usando padrões

4 Definições locais

Page 59: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

11/66

Expressão case

Expressão case é uma forma de expressão que permite selecionar um entrevários resultados possíveis baseando-se no casamento de padrões.

Uma expressão case é formada por:uma expressão de controle, cujo valor é usado para escolher uma das alternativasuma sequência de alternativas, onde cada alternativa é formada por:

I um padrão, usado para decidir se a alternativa será escolhidaI uma expressão, usada para dar o resultado caso a alternativa seja escolhida

Exemplo:

case calculo x (div y 2) of0 -> x^2 + 5*x + 61 -> 4*y - 8n -> (x^2 + y^2) / n

Page 60: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

12/66

Forma e regras de tipo da expressão case

Uma expressão case é da forma:

case exp of{ padrao1 -> res1 ;

...padraon -> resn

}onde:

a expressão de controle é expos resultados alternativos são dados pelas expressões res1, . . . , resn, selecionadospelos respectivos padrões padrao1, . . . , padraon

Regras de tipo:a expressão de controle exp e os padrões padrao1, . . . , padraon devem ser todos deum mesmo tipoos resultados res1, . . . , resn devem ser todos do mesmo tipo, o quedetermina o tipo da expressão case (ou seja, o tipo do resultado final)

Page 61: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

13/66

Regra de layout para a expressão case

A regra de layout pode ser aplicada para uma expressão case, permitindo aomissão dos sinais de pontuação {, ; e }.

Todas as alteranativas devem estar alinhadas (ou seja, devem começar namesma coluna: a coluna de alinhamento).

Se uma alternativa precisar se extender nas linhas seguintes, estas linhas devemcomeçar em uma coluna mais à direita em relação à coluna de alinhamento.

Uma linha que começa em uma coluna mais à esquerda em relação à coluna dealinhamento encerra a sequencia de alternativas (e não faz parte da expressãocase)

Page 62: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

14/66

Regra de layout para a expressão case (cont.)

Exemplo:

case calculo x (div y 2) of0 -> x^2 + 5*x + 61 -> 4*y - 8n -> (x^2 + y^2) / n

proxima_expressao

case calculo x (div y 2) of{ 0 -> x^2 + 5*x + 6;

1 -> 4*y - 8;n -> (x^2 + y^2) / n

}proxima_expressao

Page 63: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

15/66

Avaliação de expressões case

É feito o casamento de padrão do valor de exp com os padrões, na seqüência emque foram escritos, até que se obtenha sucesso ou se esgotem os padrões

O primeiro padrão cujo casamento suceder é escolhido

O resultado final da expressão case é dado pela expressão associada ao padrãoescolhido

O resultado é avaliado em um ambiente estendido com as associações devariáveis resultantes do casamento de padrão

Se a expressão não casar com nenhum padrão, a avaliação da expressão caseresulta em um erro

Page 64: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

16/66

Exemplos de expressões case

A expressão

case 3 - 2 + 1 of0 -> "zero"1 -> "um"2 -> "dois"3 -> "tres"

resulta em "dois", pois o valor da expressão 3-2+1 é 2, que casa com o terceiropadrão 2, selecionando "dois" como resultado.

Page 65: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

17/66

Exemplos de expressões case (cont.)

A expressão

case 23 > 10 ofTrue -> "beleza!"False -> "oops!"

resulta em "beleza!", pois o valor da expressão 23 > 10 é True, que casa com oprimeiro padrão True, selecionando "beleza!" como resultado.

Page 66: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

18/66

Exemplos de expressões case (cont.)

A expressão

case toUpper (head "masculino") of’F’ -> 10.2’M’ -> 20.0

resulta em 20.0, pois o valor da expressão toUpper (head "masculino") é ’M’, quecasa com o segundo padrão ’M’, selecionando 20.0 como resultado.

Page 67: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

19/66

Exemplos de expressões case (cont.)

A expressão

case head "masculino" of’F’ -> 10.2’M’ -> 20.0

resulta em um erro em tempo de execução, pois o valor da expressãohead "masculino" não casa com nenhum dos padrões.

Page 68: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

20/66

Exemplos de expressões case (cont.)

A expressão

case toUpper (head "masculino") of’F’ -> "mulher"’M’ -> 20.0

está incorreta, pois os resultados "mulher" e 20.0 não são do mesmo tipo.

Page 69: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

21/66

Exemplos de expressões case (cont.)

A expressão

case head "Masculino" == ’F’ ofTrue -> "mulher"1 -> "homem"

está incorreta, pois os padrões True e 1 não são do mesmo tipo.

Page 70: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

22/66

Exemplos de expressões case (cont.)

A expressão

case head "Masculino" ofTrue -> "mulher"False -> "homem"

está incorreta, pois a expressão head "Masculino" e os padrões True e False nãosão do mesmo tipo.

Page 71: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

23/66

Exemplos de expressões case (cont.)

A expressão

case toUpper (head "masculino") of’F’ -> 10.0

’M’ -> 20.0

está incorreta, uma vez que não segue a regra de layout (os padrões não estão namesma coluna).

Page 72: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

24/66

Exemplos de expressões case (cont.)

A expressão

case 3 - 2 + 1 ofx -> 11 * x

resulta em 22, pois o valor da expressão 3 - 2 + 1 é 2, que casa com o primeiropadrão x, associando a variável x com o valor 2, e selecionando 11 * x comoresultado

Page 73: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

25/66

Exemplos de expressões case (cont.)

A expressão

case mod 256 10 of7 -> 0n -> n * 1000

resulta em 6000, pois o valor da expressão mod 256 10 é 6, que casa com o segundopadrão n, associando a variável n com o valor 6, e selecionando n * 1000 comoresultado

Page 74: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

26/66

Exemplos de expressões case (cont.)

A expressão

case mod 257 10 of7 -> 0n -> n * 1000

resulta em 0, pois 7 é o primeiro padrão que casa com o valor da expressãomod 257 10.

Já a expressão

case mod 257 10 ofn -> n * 10007 -> 0

resulta em 7000, pois n é o primeiro padrão que casa com o valor da expressãomod 257 10.

Page 75: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

27/66

Exemplos de expressões case (cont.)

A expressão

case 46 - 2*20 of0 -> "zero"1 -> "um"2 -> "dois"3 -> "tres"4 -> "quatro"_ -> "maior que quatro"

resulta em "maior que quatro", pois _ é o primeiro padrão que casa com o valor daexpressão 46 - 2*20.

Page 76: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

28/66

Exemplos de expressões case (cont.)

A expressão

case (3+2,3-2) of(0,0) -> 10(_,1) -> 20(x,2) -> x^2(x,y) -> x*y - 1

resulta em 20, pois (_,1) é o primeiro padrão que casa com o valor da expressão(3+2,3-2).

Page 77: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

29/66

Expressão case com guardas

Em uma expressão case cada padrão pode ser acompanhado de uma seqüênciade cláusulas.

Cada cláusula é introduzida por uma barra vertical (|) e consiste em umacondição (guarda) e uma expressão (resultado), separados por ->.

Para que o resultado de uma cláusula seja escolhido é necessário que ocasamento de padrão suceda, e que a guarda correspondente seja verdadeira.

Page 78: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

30/66

Exemplo de expressão case com guardas

A expressão

case ("Paulo Roberto",’M’,28,69.3) of(_,_,idade,peso) | idade < 18 -> 2*peso

| idade < 21 -> 3*peso(_,’F’,_,peso) -> peso(_,’M’,idade,peso) | idade < 40 -> peso + 10

| otherwise -> 0.9 * peso

resulta em 79.3, pois a tupla ("Paulo Roberto",’M’,28,69.3)

casa com o primeiro padrão, porém nenhuma guarda é satisfeita

não casa com o segundo padrão

casa com o terceiro padrão, e a primeira guarda é satisfeita, logo o resultado édado por peso + 10

Page 79: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

31/66

Tópicos

1 Casamento de padrão

2 Expressão case

3 Definição de função usando padrões

4 Definições locais

Page 80: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

32/66

Definindo funções com casamento de padrão

Uma definição de função é formada por uma seqüência de equações.

Os parâmetros usados em uma equação para representar os argumentos sãopadrões.

Em uma aplicação de função o resultado é dado pela primeira equação cujosparâmetros casam com os respectivos argumentos, e cuja guarda (se houver) éverdadeira.

Se em todas as equações os casamentos de padrão falharem ou todas asguardas forem falsas, ocorre um erro de execução.

Geralmente o uso de padrões para especificar os argumentos torna a definiçãoda função mais clara.

Page 81: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

33/66

Definindo funções com casamento de padrão (cont.)

Exemplo:

not :: Bool -> Boolnot False = Truenot True = FalseA função not mapeia False a True, e True a False.not False Truenot (even 6) False

Page 82: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

34/66

Definindo funções com casamento de padrão (cont.)

Exemplo:

(&&) :: Bool -> Bool -> BoolTrue && True = TrueTrue && False = FalseFalse && True = FalseFalse && False = False

True && True TrueFalse && True False2>3 && odd 4 False

Page 83: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

35/66

Definindo funções com casamento de padrão (cont.)

Exemplo:

(&&) :: Bool -> Bool -> BoolTrue && True = True_ && _ = False

True && True TrueFalse && True False2>3 && 2<3 False

Page 84: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

36/66

Definindo funções com casamento de padrão (cont.)

Exemplo:

(&&) :: Bool -> Bool -> BoolTrue && b = bFalse && _ = False

True && True True2>3 && 2<3 False2<3 && even 5 False

Page 85: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

37/66

Definindo funções com casamento de padrão (cont.)

Exemplo:

(&&) :: Bool -> Bool -> Boolb && b = b_ && _ = False

está incorreto, pois não é possível usar uma variável mais de uma vez nospadrões (princípio da linearidade).

Page 86: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

38/66

Definindo funções com casamento de padrão (cont.)

Exemplos:

fst :: (a,b) -> afst (x,_) = x

snd :: (a,b) -> bsnd (_,y) = y

fst (1+2,1-2) 3snd (div 5 0,even 9) False

Page 87: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

39/66

Exercícios

Exercício 1

Dê três possíveis definições para o operador lógico ou (||), utilizando casamento depadrão.

Page 88: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

40/66

Exercícios (cont.)

Exercício 2

Redefina a seguinte versão do operador lógico e (&&) usando expressões condicionaisao invés de casamento de padrão:

True && True = True_ && _ = False

Exercício 3

Redefina a seguinte versão do operador lógico e (&&) usando expressões condicionaisao invés de casamento de padrão:

True && b = bFalse && _ = False

Comente sobre o diferente número de expressões condicionais necessárias emcomparação com o exercício 2.

Page 89: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

41/66

Exercícios (cont.)

Exercício 4

Defina uma função que recebe dois pontos no espaço e retorna a distância entre eles.Considere que um ponto no espaço é representado por uma tripla de números quesão as coordenadas do ponto. Use casamento de padrão.

Exercício 5

Analise a seguinte definição e apresente uma definição alternativa mais simples destafunção.

opp :: (Int,(Int,Int)) -> Intopp z = if fst z == 1

then fst (snd z) + snd (snd z)else if fst z == 2

then fst (snd z) - snd (snd z)else 0

Page 90: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

42/66

Tópicos

1 Casamento de padrão

2 Expressão case

3 Definição de função usando padrões

4 Definições locais

Page 91: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

43/66

Definições locais com where

A palavra reservada where é utilizada para introduzir definições locais cujocontexto (ou escopo) é a expressão no lado direito e as guardas (quando houver)de uma equação.

Exemplo:

f :: Fractional a => (a,a) -> af (x,y) = (a + 1) * (a + 2) where a = (x+y)/2

f (2,3) 15.75f (5,1) 20.0

Page 92: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

44/66

Definições locais com where (cont.)

Quando há duas ou mais definições locais, elas podem ser escritas em diferentesestilos.

Exemplos:

f (x,y) = (a+1)*(b+2)where { a = (x+y)/2; b = (x+y)/3 }

f (x,y) = (a+1)*(b+2)where a = (x+y)/2; b = (x+y)/3

f (x,y) = (a+1)*(b+2)where a = (x+y)/2

b = (x+y)/3

Neste último exemplo foi usada a regra de layout, que dispensa os símbolos ;, {e } mas exige que cada definição local esteja alinhada em uma mesma coluna.

Page 93: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

45/66

Definições locais com where (cont.)

Exemplo:

square x = x * x

g x y | x <= 10 = x + a| x > 10 = x - a

wherea = square (y+1)

O escopo de a inclui os dois possíveis resultados, determinados pelas guardas.

Page 94: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

46/66

Definições locais com where (cont.)

As definições locais podem ser de funções e de variáveis, fazendo uso depadrões.

Exemplo:

h y = 3 + f y + f a + f bwhere

c = 10(a,b) = (3*c,f 2)f x = x + 7*c

h 5 320O escopo de a inclui os dois possíveis resultados, determinados pelas guardas.

Page 95: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

47/66

Definições locais com where (cont.)

Exemplo: análise do índice de massa corporal

analisaIMC peso altura| imc <= 18.5 = "Voce esta abaixo do peso, seu emo!"| imc <= 25.0 = "Voce parece normal. Deve ser feio!"| imc <= 30.0 = "Voce esta gordo! Perca algum peso!"| otherwise = "Voce esta uma baleia. Parabens!"where

imc = peso / height ^2

Ou ainda:analisaIMC peso altura

| imc <= magro = "Voce esta abaixo do peso, seu emo!"| imc <= normal = "Voce parece normal. Deve ser feio!"| imc <= gordo = "Voce esta gordo! Perca algum peso!"| otherwise = "Voce esta uma baleia. Parabens!"where

imc = peso / height ^2magro = 18.5normal = 25.0gordo = 30.0

Page 96: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

48/66

Definições locais com where (cont.)

Definições locais com where não são compartilhadas entre corpos de funções dediferentes padrões nas equações.

Exemplo:saudacao :: String -> Stringsaudacao "Joana" = saudacaoLegal ++ " Joana!"saudacao "Ferando" = saudacaoLegal ++ " Fernando!"saudacao nome = saudacaoInfeliz ++ " " ++ nome

wheresaudacaoLegal = "Ola! Que bom encontrar voce, "saudacaoInfeliz = "Oh! Pfft. E voce, "

Esta definição de função está incorreta. Para corrigi-la, transforme as definiçõeslocais de saudacaoLegal e saudacaoInfeliz em definições globais.

Page 97: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

49/66

Expressoes let

Uma expressão let é formada por uma lista de declarações mutuamenterecursivas, e por uma expressão:

let definições in expressão

O escopo das declarações é a expressão e o lado direito das declarações.Portanto os nomes introduzidos nas declarações só podem ser usados naspróprias declarações e na expressão.

O tipo da expressão let é o tipo da expressão que aparece no seu corpo.

O valor da expressão let é o valor da expressão que aparece no seu corpo,calculado em um contexto que inclui as variáveis introduzidas nas declarações.

A expressão let se estende à direita tanto quanto possível.

Page 98: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

50/66

Expressoes let (cont.)

Exemplos:let a = 5 in (a - 1)*a + 1 21

Page 99: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

51/66

Expressoes let (cont.)

let { y = 1 + 2; z = 4 + 6 } in y + z 21

Page 100: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

52/66

Expressoes let (cont.)

let r = 3; s = 6 in r^2 + s^2 45

Page 101: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

53/66

Expressoes let (cont.)

let a = 1b = -5c = 6r = sqrt (b^2 - 4*a*c)k = a/2

in ((-b + r)/k,(-b - r)/k) (12.0,8.0)

Page 102: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

54/66

Expressoes let (cont.)

f a b = let y = a*bg x = (x+y)/y

in g (2*a) + g (3*b)

f 3 4 3.5

Page 103: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

55/66

Expressoes let (cont.)

4 * let x = 5-2 in x * x 36

Page 104: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

56/66

Expressoes let (cont.)

(let x = 5-2 in x * x) ^ 2 81

Page 105: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

57/66

Expressoes let (cont.)

[ let square x = x*x in (square 5,square 3, square 2) ] [(25,9,4)]

Page 106: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

58/66

Expressoes let (cont.)

( let a = 100; b = 200; c = 300 in a*b*c, let foo = "Hey "; bar = "there!" in foo ++ bar) (6000000,"Hey there!")

Page 107: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

59/66

Expressoes let (cont.)

let (a,b,c) = (1,2,3) in a + b + c 6

Page 108: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

60/66

Expressoes let (cont.)

let a = 1in let b = 2

in a + b 3

Page 109: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

61/66

Expressoes let (cont.)

let x = 7 in (let x = "foo" in x, x) ("foo",7)

Page 110: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

62/66

Expressoes let (cont.)

let c = 10(a,b) = (3*c, f 2)f x = x + 7*c

in f a + f b 242

Page 111: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

63/66

Expressoes let (cont.)

Exemplo:Cálculo da área da superfície de um cilindro:

areaSuperfCil :: Double -> Double -> DoubleareaSuperfCil r h = let areaLado = 2 * pi * r * h

areaBase = pi * r^2in areaLado + 2*areaBase

Page 112: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

64/66

Diferenças entre let e where

Com where as definições são colocadas no final, e com let elas são colocadasno início.

let é uma expressão e pode ser usada em qualquer lugar onde se espera umaexpressão.

Já where não é uma expressão, podendo ser usada apenas para fazer definiçõeslocais em uma definição de função.

Page 113: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

65/66

Exercícios

Exercício 6

Defina uma função para calcular as raízes reais do polinômio

ax2 +bx + c

Faça duas versões, usando:

expressão let para calcular o discrimante

definição local com where para calcular o discriminante.

Teste suas funções no GHCi.Dica: Use a função error :: String -> a do prelúdio, que exibe uma mensagemde erro e termina o programa, para exibir uma mensagem quando não houver raízesreais.

Page 114: Programação Funcional - DECOM · Programação Funcional Capítulo 6 Casamento de Padrão José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

66/66

Fim