• Nenhum resultado encontrado

Leituras de valores numéricos

N/A
N/A
Protected

Academic year: 2021

Share "Leituras de valores numéricos"

Copied!
99
0
0

Texto

(1)

DIM0425 - Conceitos e Técnicas de Programação

1

Leituras de valores numéricos

(2)

DIM0108.0 - Conceitos e Técnicas de Programação

Leitura de valores numéricos em uma linha só...

São dois comandos:

read_int()

read_float()

★Erro de execução quando não é digitado um número

2

(3)

DIM0108.0 - Conceitos e Técnicas de Programação

Leitura de valores numéricos em uma linha só...

São dois comandos:

read_int()

read_float()

★Erro de execução quando não é digitado um número

2

(* lê um inteiro, dá o nome i1 ao valor lido *) let i1 : int = read_int ();;

(* lê um inteiro, dá o nome i2 ao valor lido *) let i2 : int = read_int ();;

(* lê um float, dá o nome f ao valor lido *) let f : float = read_float ();;

(* imprime a soma de i1 e i2 em uma linha *) print_int (i1 + i2);

print_newline ();

(* imprime o dobro de f em uma linha *) print_float (f *. 2.);

print_newline ();;

(4)

DIM0108.0 - Conceitos e Técnicas de Programação

Leitura de valores numéricos em uma linha só...

São dois comandos:

read_int()

read_float()

★Erro de execução quando não é digitado um número

2

(* lê um inteiro, dá o nome i1 ao valor lido *) let i1 : int = read_int ();;

(* lê um inteiro, dá o nome i2 ao valor lido *) let i2 : int = read_int ();;

(* lê um float, dá o nome f ao valor lido *) let f : float = read_float ();;

(* imprime a soma de i1 e i2 em uma linha *) print_int (i1 + i2);

print_newline ();

(* imprime o dobro de f em uma linha *) print_float (f *. 2.);

print_newline ();;

localhost:david$ ocamlc.opt leitura.ml -o leitura localhost:david$ ./leitura 3 4 1 7 2. localhost:david$ Monday, July 19, 2010

(5)

DIM0425 - Conceitos e Técnicas de Programação

3

Funções

(6)

DIM0108.0 - Conceitos e Técnicas de Programação

4

Funções

Wikipedia: Function (mathematics), an abstract entity that associates an input to

a corresponding output according to some rule.

Exemplo:

Em programação funcional, funções são trechos de códigos responsáveis

para calcular o valor da aplicação de uma função (matemática) para uma determinada entrada.

Exemplo:

Caml

Lua

C fun (x : int) -> x * x

function (x) return x*x end int f (int x)

{

return x * x; }

(7)

DIM0108.0 - Conceitos e Técnicas de Programação

5

Definição de funções em OCaml

Funções são definidas com:

a palavra chave fun, seguida de

os parâmetros: os argumentos da função,

o separador ->,

o corpo: uma expressão que depende dos parâmetros e que define o

resultado.

★Exemplos: fun (x : int) -> x * x

fun (x : float) -> x *. x

(8)

DIM0108.0 - Conceitos e Técnicas de Programação

6

Funções nomeadas

Frequentemente, precisamos atribuir um nome a uma função:

A função pode ser utilizada em diversos lugares e não queremos digitar toda a definição a cada vez.

Dar um bom nome à definição permite esclarecer o seu papel e tornar o código mais legível.

Em OCaml, o mecanismo para dar um nome a um valor é o let (aula 3).

★Exemplo:

O nome int_square passa a representar uma função Caml que calcula o quadrado de um inteiro.

# let int_square : int -> int = fun (i : int) -> i * i;;

val int_square : int -> int = <fun>

# int_square (~- 5);;

- : int = 25

# int_square (1 + (int_square 3));;

- : int = 100

(9)

DIM0108.0 - Conceitos e Técnicas de Programação

7

Funções nomeadas

Podemos utilizar a sintaxe alternativa para explicitar o tipo da função:

★Exemplo:

Pode-se também explicitar ambos tipos: da função e dos parâmetros.

Evidentemente, deve-se ter tipos compatíveis...

★O sistema de tipos de OCaml permite inferir o tipo também:

let int_square : int -> int = fun i -> i * i

let int_square : int -> int = fun (i : int) -> i * i

let int_square = fun i -> i * i

(10)

DIM0108.0 - Conceitos e Técnicas de Programação

8

Funções: unidades coesas de código

Em programação, funções podem ser usadas para agrupar unidades coesas

de código:

módulos responsáveis por um determinado papel

o papel só depende dos parâmetros

o papel pode ser usado para definir outros papeis.

# let potencia2 =

fun (n : int) -> n * n;;

val potencia2 : int -> int = <fun> # let potencia4 =

fun (n : int) -> (potencia2 (potencia2 n));;

val potencia4 : int -> int = <fun> # potencia4 2;;

- : int = 16

(11)

DIM0108.0 - Conceitos e Técnicas de Programação

9

Exercícios

Escreva, em O’Caml, uma função que, dada um numero inteiro, retorna o

cubo deste número.

(12)

DIM0108.0 - Conceitos e Técnicas de Programação

9

Exercícios

Escreva, em O’Caml, uma função que, dada um numero inteiro, retorna o

cubo deste número.

fun

(x : int)

-> x * x * x

(13)

DIM0108.0 - Conceitos e Técnicas de Programação

10

Tipos de funções

Funções são valores de tipos funcionais.

★Um tipo funcional é composto de dois tipos:

O tipo dos valores de entrada da função (A)

O tipo dos valores de resultado da função (B)

A notação empregrada é A -> B

★Exemplos:

# fun (i : int) -> i * i;;

- : int -> int = <fun> # fun (i : int) -> i *. i;;

- : float -> float = <fun>

(14)

DIM0108.0 - Conceitos e Técnicas de Programação

11

Tipo do parâmetro

★Caml determina corretamente o tipo dessas duas funções.

O tipo dos operandos do operador * é int.

O tipo dos operandos do operador *. é float.

★Podemos definir explicitamente esse tipo:

É uma forma de explicitar a intenção.

Torna mais fácil a leitura e o entendimento do programa

Permite verificar se a nossa intenção é corretamente implementada.

# fun x -> x * x;;

-: int -> int = <fun>

# fun x -> x *. x;;

-: float -> float = <fun>

# fun (x : int) -> x * x;;

- : int -> int = <fun>

# fun (x : float) -> x *. x;;

- : float -> float = <fun>

(15)

DIM0108.0 - Conceitos e Técnicas de Programação

11

Tipo do parâmetro

★Caml determina corretamente o tipo dessas duas funções.

O tipo dos operandos do operador * é int.

O tipo dos operandos do operador *. é float.

★Podemos definir explicitamente esse tipo:

É uma forma de explicitar a intenção.

Torna mais fácil a leitura e o entendimento do programa

Permite verificar se a nossa intenção é corretamente implementada.

# fun x -> x * x;;

-: int -> int = <fun>

# fun x -> x *. x;;

-: float -> float = <fun>

# fun (x : int) -> x * x;;

- : int -> int = <fun>

# fun (x : float) -> x *. x;;

- : float -> float = <fun>

# fun (x : float) -> x * x;;

This expression has type float but is here used with type int

(16)

DIM0108.0 - Conceitos e Técnicas de Programação

12

Para cada função, identifique:

o tipo do parâmetro

o tipo do resultado

o tipo da função

Tipo do parâmetro: exercício

fun (x : int) -> x * (x + x) fun x -> x /. 2.

(17)

DIM0108.0 - Conceitos e Técnicas de Programação

12

Para cada função, identifique:

o tipo do parâmetro

o tipo do resultado

o tipo da função

Tipo do parâmetro: exercício

fun (x : int) -> x * (x + x) int int int -> int

fun x -> x /. 2.

(18)

DIM0108.0 - Conceitos e Técnicas de Programação

12

Para cada função, identifique:

o tipo do parâmetro

o tipo do resultado

o tipo da função

Tipo do parâmetro: exercício

fun (x : int) -> x * (x + x) int int int -> int

fun x -> x /. 2. float float float -> float

(19)

DIM0108.0 - Conceitos e Técnicas de Programação

13

Aplicação de funções

Aplicar uma função Caml a um, ou vários valores, permite calcular a imagem

desses valores pela função matemática representada.

★Sintaxe:

função valores ou (função valores)

Exemplos:

(fun i -> i * i) 2 ou ((fun i -> i * i) 2)

★Semântica:

O parâmetro formal é substituído pelo valor do parâmetro efetivo

o parâmetro formal i é substituído pelo parâmetro efetivo 2

O corpo da função é avaliado

a expressão 2 * 2 é avaliada;

O resultado da avaliação é o resultado da aplicação da função:

- : int = 4

(20)

DIM0108.0 - Conceitos e Técnicas de Programação

14

Aplicação de funções

(21)

DIM0108.0 - Conceitos e Técnicas de Programação

14

Aplicação de funções

Exemplos:

(22)

DIM0108.0 - Conceitos e Técnicas de Programação 14

Aplicação de funções

Exemplos:

((fun i -> i * i) 2) Monday, July 19, 2010

(23)

DIM0108.0 - Conceitos e Técnicas de Programação 14

Aplicação de funções

Exemplos:

((fun i -> i * i) 2)

((fun i -> i * i) 2) Monday, July 19, 2010

(24)

DIM0108.0 - Conceitos e Técnicas de Programação 14

Aplicação de funções

Exemplos:

((fun i -> i * i) 2)

((fun i -> i * i) 2)

2 * 2 Monday, July 19, 2010

(25)

DIM0108.0 - Conceitos e Técnicas de Programação 14

Aplicação de funções

Exemplos:

((fun i -> i * i) 2)

((fun i -> i * i) 2)

2 * 2

4 Monday, July 19, 2010

(26)

DIM0108.0 - Conceitos e Técnicas de Programação

15

Aplicação de funções

(27)

DIM0108.0 - Conceitos e Técnicas de Programação

15

Aplicação de funções

Exemplos:

(28)

DIM0108.0 - Conceitos e Técnicas de Programação 15

Aplicação de funções

Exemplos:

((fun i -> i * i) (5 - 4)) Monday, July 19, 2010

(29)

DIM0108.0 - Conceitos e Técnicas de Programação 15

Aplicação de funções

Exemplos:

((fun i -> i * i) (5 - 4))

((fun i -> i * i) (5 - 4)) Monday, July 19, 2010

(30)

DIM0108.0 - Conceitos e Técnicas de Programação 15

Aplicação de funções

Exemplos:

((fun i -> i * i) (5 - 4))

((fun i -> i * i) (5 - 4))

((fun i -> i * i) 1) Monday, July 19, 2010

(31)

DIM0108.0 - Conceitos e Técnicas de Programação 15

Aplicação de funções

Exemplos:

((fun i -> i * i) (5 - 4))

((fun i -> i * i) (5 - 4))

((fun i -> i * i) 1)

1 * 1 Monday, July 19, 2010

(32)

DIM0108.0 - Conceitos e Técnicas de Programação 15

Aplicação de funções

Exemplos:

((fun i -> i * i) (5 - 4))

((fun i -> i * i) (5 - 4))

((fun i -> i * i) 1)

1 * 1

1 Monday, July 19, 2010

(33)

DIM0108.0 - Conceitos e Técnicas de Programação

16

Aplicação de funções

(34)

DIM0108.0 - Conceitos e Técnicas de Programação

16

Aplicação de funções

Exemplos:

(35)

DIM0108.0 - Conceitos e Técnicas de Programação 16

Aplicação de funções

Exemplos:

((fun i -> i + i) ((fun i -> i * i) 2)) Monday, July 19, 2010

(36)

DIM0108.0 - Conceitos e Técnicas de Programação 16

Aplicação de funções

Exemplos:

((fun i -> i + i) ((fun i -> i * i) 2))

((fun i -> i + i) ((fun i -> i * i) 2)) Monday, July 19, 2010

(37)

DIM0108.0 - Conceitos e Técnicas de Programação 16

Aplicação de funções

Exemplos:

((fun i -> i + i) ((fun i -> i * i) 2))

((fun i -> i + i) ((fun i -> i * i) 2))

((fun i -> i + i) 4) Monday, July 19, 2010

(38)

DIM0108.0 - Conceitos e Técnicas de Programação 16

Aplicação de funções

Exemplos:

((fun i -> i + i) ((fun i -> i * i) 2))

((fun i -> i + i) ((fun i -> i * i) 2))

((fun i -> i + i) 4)

4 + 4 Monday, July 19, 2010

(39)

DIM0108.0 - Conceitos e Técnicas de Programação 16

Aplicação de funções

Exemplos:

((fun i -> i + i) ((fun i -> i * i) 2))

((fun i -> i + i) ((fun i -> i * i) 2))

((fun i -> i + i) 4)

4 + 4

8 Monday, July 19, 2010

(40)

DIM0108.0 - Conceitos e Técnicas de Programação

17

Aplicação de funções

(41)

DIM0108.0 - Conceitos e Técnicas de Programação

17

Aplicação de funções

Exemplos:

(42)

DIM0108.0 - Conceitos e Técnicas de Programação 17

Aplicação de funções

Exemplos:

((fun i -> i *. i) 2.0) Monday, July 19, 2010

(43)

DIM0108.0 - Conceitos e Técnicas de Programação 17

Aplicação de funções

Exemplos:

((fun i -> i *. i) 2.0)

((fun i -> i *. i) 2.0) Monday, July 19, 2010

(44)

DIM0108.0 - Conceitos e Técnicas de Programação 17

Aplicação de funções

Exemplos:

((fun i -> i *. i) 2.0)

((fun i -> i *. i) 2.0)

2.0 *. 2.0 Monday, July 19, 2010

(45)

DIM0108.0 - Conceitos e Técnicas de Programação 17

Aplicação de funções

Exemplos:

((fun i -> i *. i) 2.0)

((fun i -> i *. i) 2.0)

2.0 *. 2.0

4.0 Monday, July 19, 2010

(46)

DIM0108.0 - Conceitos e Técnicas de Programação

18

Aplicação de funções

(47)

DIM0108.0 - Conceitos e Técnicas de Programação

18

Aplicação de funções

Exemplos:

(48)

DIM0108.0 - Conceitos e Técnicas de Programação

18

Aplicação de funções

Exemplos:

(fun x -> fun y -> x + (int_of_float y)) 2 5.3

(49)

DIM0108.0 - Conceitos e Técnicas de Programação

18

Aplicação de funções

Exemplos:

(fun x -> fun y -> x + (int_of_float y)) 2 5.3

(fun x -> fun y -> x + (int_of_float y)) 2 5.3

(50)

DIM0108.0 - Conceitos e Técnicas de Programação

18

Aplicação de funções

Exemplos:

(fun x -> fun y -> x + (int_of_float y)) 2 5.3

(fun x -> fun y -> x + (int_of_float y)) 2 5.3

(fun y -> 2 + (int_of_float y)) 5.3

(51)

DIM0108.0 - Conceitos e Técnicas de Programação

18

Aplicação de funções

Exemplos:

(fun x -> fun y -> x + (int_of_float y)) 2 5.3

(fun x -> fun y -> x + (int_of_float y)) 2 5.3

(fun y -> 2 + (int_of_float y)) 5.3

(fun y -> 2 + (int_of_float y)) 5.3

(52)

DIM0108.0 - Conceitos e Técnicas de Programação

18

Aplicação de funções

Exemplos:

(fun x -> fun y -> x + (int_of_float y)) 2 5.3

(fun x -> fun y -> x + (int_of_float y)) 2 5.3

(fun y -> 2 + (int_of_float y)) 5.3

(fun y -> 2 + (int_of_float y)) 5.3

2 + (int_of_float 5.3)

(53)

DIM0108.0 - Conceitos e Técnicas de Programação

18

Aplicação de funções

Exemplos:

(fun x -> fun y -> x + (int_of_float y)) 2 5.3

(fun x -> fun y -> x + (int_of_float y)) 2 5.3

(fun y -> 2 + (int_of_float y)) 5.3

(fun y -> 2 + (int_of_float y)) 5.3

2 + (int_of_float 5.3)

2 + 5

(54)

DIM0108.0 - Conceitos e Técnicas de Programação

18

Aplicação de funções

Exemplos:

(fun x -> fun y -> x + (int_of_float y)) 2 5.3

(fun x -> fun y -> x + (int_of_float y)) 2 5.3

(fun y -> 2 + (int_of_float y)) 5.3

(fun y -> 2 + (int_of_float y)) 5.3

2 + (int_of_float 5.3)

2 + 5

7

(55)

DIM0108.0 - Conceitos e Técnicas de Programação

19

Aplicação de funções

(56)

DIM0108.0 - Conceitos e Técnicas de Programação

19

Aplicação de funções

Exemplos:

(57)

DIM0108.0 - Conceitos e Técnicas de Programação

19

Aplicação de funções

Exemplos:

(fun x -> fun y -> x + (int_of_float y)) 0

(58)

DIM0108.0 - Conceitos e Técnicas de Programação

19

Aplicação de funções

Exemplos:

(fun x -> fun y -> x + (int_of_float y)) 0

(fun x -> fun y -> x + (int_of_float y)) 0

(59)

DIM0108.0 - Conceitos e Técnicas de Programação

19

Aplicação de funções

Exemplos:

(fun x -> fun y -> x + (int_of_float y)) 0

(fun x -> fun y -> x + (int_of_float y)) 0

(fun y -> 0 + (int_of_float y))

(60)

DIM0108.0 - Conceitos e Técnicas de Programação

19

Aplicação de funções

Exemplos:

(fun x -> fun y -> x + (int_of_float y)) 0

(fun x -> fun y -> x + (int_of_float y)) 0

(fun y -> 0 + (int_of_float y))

fun y -> (int_of_float y)

(61)

DIM0108.0 - Conceitos e Técnicas de Programação

20

Aplicação de funções e tipagem

O tipo do parâmetro efetivo deve ser o mesmo do parâmetro formal:

# (fun i -> i *. i) 2;;

This expression has type int but is here used with type float

(62)

DIM0108.0 - Conceitos e Técnicas de Programação

21

Aplicação de funções e associatividade

★OCaml aplica a primeira função.

É seguida de dois argumentos (uma função e um inteiro).

Não corresponde à definição da função.

Colocar os parênteses elimina eventuais ambigüidades.

# (fun i -> i * i) (fun i -> i * i) 2;;

This function is applied to too many arguments, maybe you forgot a `;'

# (fun i -> i * i) ((fun i -> i * i) 2);;

- : int = 16

(63)

DIM0108.0 - Conceitos e Técnicas de Programação

22

Aplicação de funções e precedência

A aplicação de função tem maior precedência que os demais operadores.

# (fun i -> i * i) 2 * 3;; - : int = 12 # ((fun i -> i * i) 2) * 3;; - : int = 12 # (fun i -> i * i) (2 * 3);; - : int = 36 Monday, July 19, 2010

(64)

DIM0108.0 - Conceitos e Técnicas de Programação

23

Multiplos parâmetros

Pode-se definir funções que tenham mais de um parâmetro.

★Exemplo

# let linear = fun (a : float) (b : float) (x : float) -> a *. x +. b;;

val linear : float -> float -> float -> float = <fun> # linear 2.0 3.0 1.4;;

- : float = 5.8

linear 2.0 3.0 1.4

» (fun (a : float) (b : float) (x : float) -> a *. x +. b) 2.0 3.0 1.4 » 2.0 *. 1.4 +. 3.0

» 5.8

(65)

DIM0108.0 - Conceitos e Técnicas de Programação

24

Como funciona?

Funções de n parâmetros são representadas como funções de 1 parâmetro

retornando uma função de n-1 parâmetros.

★Exemplo

(66)

DIM0108.0 - Conceitos e Técnicas de Programação

24

Como funciona?

Funções de n parâmetros são representadas como funções de 1 parâmetro

retornando uma função de n-1 parâmetros.

★Exemplo

fun (a : float) (b : float) (x : float) -> a *. x +. b

» fun (a: float) -> fun (b : float) (x : float) -> a *. x +. b

(67)

DIM0108.0 - Conceitos e Técnicas de Programação

24

Como funciona?

Funções de n parâmetros são representadas como funções de 1 parâmetro

retornando uma função de n-1 parâmetros.

★Exemplo

fun (a : float) (b : float) (x : float) -> a *. x +. b

» fun (a: float) -> fun (b : float) (x : float) -> a *. x +. b fun (b : float) (x : float) -> a *. x +. b

» fun (b: float) -> fun (x : float) -> a *. x +. b

(68)

DIM0108.0 - Conceitos e Técnicas de Programação

24

Como funciona?

Funções de n parâmetros são representadas como funções de 1 parâmetro

retornando uma função de n-1 parâmetros.

★Exemplo

fun (a : float) (b : float) (x : float) -> a *. x +. b

» fun (a: float) -> fun (b : float) (x : float) -> a *. x +. b fun (b : float) (x : float) -> a *. x +. b

» fun (b: float) -> fun (x : float) -> a *. x +. b fun (a : float) (b : float) (x : float) -> a *. x +. b

»»» fun (a : float) -> fun (b : float) -> fun (x : float) -> a *. x +. b

(69)

DIM0108.0 - Conceitos e Técnicas de Programação

25

Como funciona?

(70)

DIM0108.0 - Conceitos e Técnicas de Programação

25

Como funciona?

linear 2.0 3.0 1.4

(71)

DIM0108.0 - Conceitos e Técnicas de Programação

25

Como funciona?

linear 2.0 3.0 1.4

» (fun (a : float) (b : float) (x : float) -> a *. x +. b ) 2.0 3.0 1.4

(72)

DIM0108.0 - Conceitos e Técnicas de Programação

25

Como funciona?

linear 2.0 3.0 1.4

» (fun (a : float) (b : float) (x : float) -> a *. x +. b ) 2.0 3.0 1.4

» (fun (a : float) -> fun (b : float) -> fun (x : float) -> a *. x +. b) 2.0 3.0 1.4 » (fun (a : float) -> fun (b : float) -> fun (x : float) -> a *. x +. b) 2.0 3.0 1.4

(73)

DIM0108.0 - Conceitos e Técnicas de Programação

25

Como funciona?

linear 2.0 3.0 1.4

» (fun (a : float) (b : float) (x : float) -> a *. x +. b ) 2.0 3.0 1.4

» (fun (a : float) -> fun (b : float) -> fun (x : float) -> a *. x +. b) 2.0 3.0 1.4 » (fun (a : float) -> fun (b : float) -> fun (x : float) -> a *. x +. b) 2.0 3.0 1.4 » (fun (b : float) -> fun (x : float) -> 2.0 *. x +. b) 3.0 1.4

» (fun (b : float) -> fun (x : float) -> 2.0 *. x +. b) 3.0 1.4

(74)

DIM0108.0 - Conceitos e Técnicas de Programação

25

Como funciona?

linear 2.0 3.0 1.4

» (fun (a : float) (b : float) (x : float) -> a *. x +. b ) 2.0 3.0 1.4

» (fun (a : float) -> fun (b : float) -> fun (x : float) -> a *. x +. b) 2.0 3.0 1.4 » (fun (a : float) -> fun (b : float) -> fun (x : float) -> a *. x +. b) 2.0 3.0 1.4 » (fun (b : float) -> fun (x : float) -> 2.0 *. x +. b) 3.0 1.4

» (fun (b : float) -> fun (x : float) -> 2.0 *. x +. b) 3.0 1.4 » (fun (x : float) -> 2.0 *. x +. 3.0) 1.4

» (fun (x : float) -> 2.0 *. x +. 3.0) 1.4

(75)

DIM0108.0 - Conceitos e Técnicas de Programação

25

Como funciona?

linear 2.0 3.0 1.4

» (fun (a : float) (b : float) (x : float) -> a *. x +. b ) 2.0 3.0 1.4

» (fun (a : float) -> fun (b : float) -> fun (x : float) -> a *. x +. b) 2.0 3.0 1.4 » (fun (a : float) -> fun (b : float) -> fun (x : float) -> a *. x +. b) 2.0 3.0 1.4 » (fun (b : float) -> fun (x : float) -> 2.0 *. x +. b) 3.0 1.4

» (fun (b : float) -> fun (x : float) -> 2.0 *. x +. b) 3.0 1.4 » (fun (x : float) -> 2.0 *. x +. 3.0) 1.4

» (fun (x : float) -> 2.0 *. x +. 3.0) 1.4

» 2.0 *. 1.4 +. 3.0

(76)

DIM0108.0 - Conceitos e Técnicas de Programação

25

Como funciona?

linear 2.0 3.0 1.4

» (fun (a : float) (b : float) (x : float) -> a *. x +. b ) 2.0 3.0 1.4

» (fun (a : float) -> fun (b : float) -> fun (x : float) -> a *. x +. b) 2.0 3.0 1.4 » (fun (a : float) -> fun (b : float) -> fun (x : float) -> a *. x +. b) 2.0 3.0 1.4 » (fun (b : float) -> fun (x : float) -> 2.0 *. x +. b) 3.0 1.4

» (fun (b : float) -> fun (x : float) -> 2.0 *. x +. b) 3.0 1.4 » (fun (x : float) -> 2.0 *. x +. 3.0) 1.4

» (fun (x : float) -> 2.0 *. x +. 3.0) 1.4

» 2.0 *. 1.4 +. 3.0 » 5.8

(77)

DIM0108.0 - Conceitos e Técnicas de Programação

26

Visualizando a avaliação da aplicação de função.

# let f1 = fun x y -> x + y;;

val f1 : int -> int -> int = <fun> # #trace f1;; f1 is now traced. # f1 3 4;; f1 <-- 3 f1 --> <fun> f1* <-- 4 f1* --> 7 - : int = 7 # Monday, July 19, 2010

(78)

DIM0108.0 - Conceitos e Técnicas de Programação

27

Funções como valores

Funções são valores de tipos funcionais.

★Uma função pode então ser o resultado de uma função.

exemplos

função de múltiplos argumentos (técnica de curryficação).

★Uma função pode ser o parâmetro de uma função.

exemplos

função de ordem superior

(79)

DIM0108.0 - Conceitos e Técnicas de Programação

28

Exercícios

Considere a função Caml seguinte:

fun a b c -> (a *. 4.0 +. b *. 5.0 +. c *. 6.0) /. 15.0

Aplicamos os valores 7,0 e 9,0. Qual função representa o resultado da aplicação desses dois valores?

(80)

DIM0108.0 - Conceitos e Técnicas de Programação

28

Exercícios

Considere a função Caml seguinte:

fun a b c -> (a *. 4.0 +. b *. 5.0 +. c *. 6.0) /. 15.0

Aplicamos os valores 7,0 e 9,0. Qual função representa o resultado da aplicação desses dois valores?

substituindo a por 7.0 e b por 9.0: fun c -> (73. +. c*.6.0) /. 15.

(81)

DIM0108.0 - Conceitos e Técnicas de Programação

29

Funções tendo função como resultado

A aplicação de uma função pode ser uma função

O tipo resultado é um tipo funcional

★Exemplo:

(82)

DIM0108.0 - Conceitos e Técnicas de Programação

29

Funções tendo função como resultado

A aplicação de uma função pode ser uma função

O tipo resultado é um tipo funcional

★Exemplo:

# let f1 = fun expo -> (fun x -> x ** (float_of_int expo));; val f1 : int -> float -> float = <fun>

# let float_cubo = f1 3;;

val float_cubo : float -> float = <fun> # float_cubo 2.0;;

- : float = 8.

(83)

DIM0108.0 - Conceitos e Técnicas de Programação

29

Funções tendo função como resultado

A aplicação de uma função pode ser uma função

O tipo resultado é um tipo funcional

★Exemplo:

# let f1 = fun expo -> (fun x -> x ** (float_of_int expo));; val f1 : int -> float -> float = <fun>

# let float_cubo = f1 3;;

val float_cubo : float -> float = <fun> # float_cubo 2.0;;

- : float = 8.

f1: dado um inteiro n, retorna uma função que, dada um real x, retorna x elevado à potência n.

(84)

DIM0108.0 - Conceitos e Técnicas de Programação

29

Funções tendo função como resultado

A aplicação de uma função pode ser uma função

O tipo resultado é um tipo funcional

★Exemplo:

# let f1 = fun expo -> (fun x -> x ** (float_of_int expo));; val f1 : int -> float -> float = <fun>

# let float_cubo = f1 3;;

val float_cubo : float -> float = <fun> # float_cubo 2.0;;

- : float = 8.

# let f2 = fun x -> (fun e -> (int_of_float ((float_of_int x) ** (float_of_int e))));; val f2 : int -> int -> int = <fun>

# let pot2 = f2 2;;

val pot2 : int -> int = <fun> # pot2 4;;

- : int = 16

f1: dado um inteiro n, retorna uma função que, dada um real x, retorna x elevado à potência n.

(85)

DIM0108.0 - Conceitos e Técnicas de Programação

29

Funções tendo função como resultado

A aplicação de uma função pode ser uma função

O tipo resultado é um tipo funcional

★Exemplo:

# let f1 = fun expo -> (fun x -> x ** (float_of_int expo));; val f1 : int -> float -> float = <fun>

# let float_cubo = f1 3;;

val float_cubo : float -> float = <fun> # float_cubo 2.0;;

- : float = 8.

# let f2 = fun x -> (fun e -> (int_of_float ((float_of_int x) ** (float_of_int e))));; val f2 : int -> int -> int = <fun>

# let pot2 = f2 2;;

val pot2 : int -> int = <fun> # pot2 4;;

- : int = 16

f1: dado um inteiro n, retorna uma função que, dada um real x, retorna x elevado à potência n.

f2: dado um inteiro x, retorna uma função que, dada um inteiro e, retorna x elevado à potência e.

(86)

DIM0108.0 - Conceitos e Técnicas de Programação

30

Funções poliádicas como combinação de funções

monádicas

Uma função de n > 1 parâmetros pode ser vista como uma função de um

único parâmetro que tem como resultado uma função de n - 1 parâmetros (técnica conhecida como curryficação1).

Exemplo:

★Notação simplificada (mas equivalente):

1 vem do nome do lógico Haskell Curry.

(87)

DIM0108.0 - Conceitos e Técnicas de Programação

30

Funções poliádicas como combinação de funções

monádicas

Uma função de n > 1 parâmetros pode ser vista como uma função de um

único parâmetro que tem como resultado uma função de n - 1 parâmetros (técnica conhecida como curryficação1).

Exemplo:

★Notação simplificada (mas equivalente):

1 vem do nome do lógico Haskell Curry.

# let media_float = fun (x1 : float) -> fun (x2 : float) -> (x1 +. x2) /. 2;;

val media_float : float -> float -> float -> float = <fun>

# let media_float = fun (x1 : float) (x2 : float) -> (x1 +. x2) /. 2;;

val media_float : float -> float -> float -> float = <fun>

(88)

DIM0108.0 - Conceitos e Técnicas de Programação

31

Sintaxe alternativa

A função:

★é equivalente à função:

★que é equivalente à função:

1vem do nome do lógico Haskell Curry.

fun a -> (fun b c -> (a *. 4.0 +. b *. 5.0 +. c *. 6.0) /. 15.0) fun a b c -> (a *. 4.0 +. b *. 5.0 +. c *. 6.0) /. 15.0

fun a -> (fun b -> (fun c -> (a *. 4.0 +. b *. 5.0 +. c *. 6.0) /. 15.0))

(89)

DIM0108.0 - Conceitos e Técnicas de Programação

32

Funções de ordem superior

Funções são valores.

Funções que tem como parâmetro outras funções são chamadas funções de

ordem superior.

Exemplo:

(90)

DIM0108.0 - Conceitos e Técnicas de Programação

32

Funções de ordem superior

Funções são valores.

Funções que tem como parâmetro outras funções são chamadas funções de

ordem superior.

Exemplo:

# let misterio = fun f x -> (f (f x)) + (f x) + x;;

val misterio : (int -> int) -> int -> int = <fun> # misterio (fun n -> n * 3) 4;;

- : int = 52

# misterio (fun x -> x / 3) 2;;

- : int = 2

(91)

DIM0108.0 - Conceitos e Técnicas de Programação

33

Funções de ordem superior: exemplo 1

# let misterio = fun f -> (fun x -> (f (f x)))

val misterio : ... = <fun>

# let pot2 = fun (i : int) -> i * i;;

val pot2 : int -> int = <fun>

# let adivinhacao = misterio pot2;;

val bizarro : int -> int = <fun> # adivinhacao 4;;

- : int = 256

(92)

DIM0108.0 - Conceitos e Técnicas de Programação

33

Funções de ordem superior: exemplo 1

# let misterio = fun f -> (fun x -> (f (f x)))

val misterio : ... = <fun>

# let pot2 = fun (i : int) -> i * i;;

val pot2 : int -> int = <fun>

# let adivinhacao = misterio pot2;;

val bizarro : int -> int = <fun> # adivinhacao 4;;

- : int = 256

O que faz a função misterio?

O que faz a função adivinhacao?

(93)

DIM0108.0 - Conceitos e Técnicas de Programação

Derivar: uma operação que transforma uma função em outra função (sua

derivada)

entrada: uma função de uma variável (número real)

saída: uma função de uma variável (também número real)

34

Funções de ordem superior

# let epsilon : float = 1e-10;;

val epsilon : float

# let deriv = fun f ->

fun x -> (f (x +. epsilon) -. f x) /. epsilon;; val deriv : (float -> float) -> float -> float = <fun>

(94)

DIM0108.0 - Conceitos e Técnicas de Programação

Derivar: uma operação que transforma uma função em outra função (sua

derivada)

entrada: uma função de uma variável (número real)

saída: uma função de uma variável (também número real)

34

Funções de ordem superior

# let sin’ = deriv sin;;

val sin' : float -> float = <fun>

# let epsilon : float = 1e-10;;

val epsilon : float

# let deriv = fun f ->

fun x -> (f (x +. epsilon) -. f x) /. epsilon;; val deriv : (float -> float) -> float -> float = <fun>

(95)

DIM0108.0 - Conceitos e Técnicas de Programação

Derivar: uma operação que transforma uma função em outra função (sua

derivada)

entrada: uma função de uma variável (número real)

saída: uma função de uma variável (também número real)

34

Funções de ordem superior

# let sin’ = deriv sin;;

val sin' : float -> float = <fun> # - : float = 1.sin' 0.0;;

# let pi = acos (~-. 1.0);;

val pi : float = 3.14159265358979312 # sin' pi;;

- : float = -1.000000082740371

# let epsilon : float = 1e-10;;

val epsilon : float

# let deriv = fun f ->

fun x -> (f (x +. epsilon) -. f x) /. epsilon;; val deriv : (float -> float) -> float -> float = <fun>

(96)

DIM0108.0 - Conceitos e Técnicas de Programação

Procedimentos

Procedimentos são rotinas que não retornam resultados.

em OCaml, o tipo do resultado dos procedimentos é unit, o valor é ()

(leia: nada).

exemplos: print_int, print_float

Procedimentos

podem alterar o conteúdo de uma memória

escrever valores

ler valores

Exemplo:

let i : int ref = ref 0

let leia : unit -> unit = fun () ->

i := read_int()

35

(97)

DIM0108.0 - Conceitos e Técnicas de Programação 36

Funções e programas

(* funcoes auxiliares *) let aux1 : ... = fun ... (* funcao principal)

let main : unit -> unit = fun () ->

let

(* declaração dos dados lidos e escritos *) <nome1> : <tipo1> = <valor inicial1> and <nome2> : <tipo2> = <valor inicial2>

in

(* leitura dos dados *)

(* calculo dos valores a imprimir *)

(* impressao dos valores calculados *) let _ =

main()

Modelo de programa 2:

(98)

DIM0108.0 - Conceitos e Técnicas de Programação

37

Funções e programas

(* declaração dos dados lidos e escritos *) let <nome1> : <tipo1> = <valor inicial1> and <nome2> : <tipo2> = <valor inicial2> ... (* funcoes auxiliares *)

let aux1 : ... = fun ...

(* funcao principal)

let main : unit -> unit = fun () ->

(* leitura dos dados *)

(* calculo dos valores a imprimir *)

(* impressao dos valores calculados *) let _ =

main()

Modelo de programa 3:

(99)

DIM0108.0 - Conceitos e Técnicas de Programação

38

Conclusões

Função: conceito de programação, relação com funções matemáticas.

Como definir funções em Caml: sintaxe e semântica

★Tipos funcionais, funções e o sistema de tipos da linguagem;

★Curryficação permite construir funções de n parâmetros como funções de

um parâmetro;

Funções podem ser nomeadas (variável) ou anônimas;

★Funções de ordem superior;

★Procedimentos.

Referências

Documentos relacionados

Art. Considera-se condição a cláusula que, derivando exclusivamente da vontade das partes, subordina o efeito do negócio jurídico a evento futuro e incerto. São lícitas,

Exposição no Átrio do Auditório Municipal de Mesão Frio Exposição dos trabalhos feitos nas Oficinas de Origamis para alunos, promovida no dia 13 de Abril de 2011 na

abpi.empauta.com Brasília, 27 de abril de 2020 UOL Notícias | BR Pirataria Continuação: Pirataria virtual cresce entre 35 e 66% em vários países durante quarentena...

E perceberás, então, como o Cristo fustigado na cruz, que os teus mais acirrados perseguidores são apenas crianças de curto entendimento e de

Considerando a formação da equipe de trabalho, o tempo de realização previsto no projeto de extensão e a especificidade das necessidades dos catadores, algumas

Na concorrência entre os fornecedores de TI para a atualização da infraestrutura da Ibiuna Investimentos, a Planus se destacou não só pela proposta mais completa, mas pela

“Apresentado que é o ponto da situação dos projectos, informo os Senhores Vereadores que conto com a colaboração de todos e assim aguardo que sejam comunicados até ao final do

Uma vez que o período pós-parto imediato também está associado a um risco aumentado de tromboembolismo, os contraceptivos hormonais combinados, como ALDIJET, devem ser iniciados