Ficha OCaml 1 : tipagem, avaliação, erros

 

Ficha OCaml 1 : tipagem, avaliação, errosEx. Tipagem.Ex. Tipagem ou erro.Ex. mistery.Ex. mistério.Ex. Erros.Ex. Tipo e valor.Ex. Qual tipo?Ex. Verdade ou falso?Ex. Qual o tipo?Ex. Tipagem.Ex. Manipulação de tuplosEx. Chamadas à funções.


 

Ex. Tipagem.

Dê o tipo das expressões seguintes:


 

Ex. Tipagem ou erro.

Para cada uma das alíneas seguintes, dar o tipo da expressão e se não houver tipo por causa de um erro, explique a razão do erro :


 

Ex. mistery.

Considere a seguinte função mistery:

  1. Dê o seu tipo.
  2. Qual é o valor devolvido por mistery 2 3 1?
  3. Assumindo que os parâmetros todos são inteiros naturais, e que na chamada inicial z é um, explique o que calcula esta função.
  4. Assumindo que os parâmetros todos são inteiros naturais, e que na chamada inicial z é um, demonstre a afirmação do ponto anterior.

 

Ex. mistério.

Considere a seguinte função misterio:

  1. Dê o tipo da função misterio.
  2. Qual é o valor devolvido por misterio 13 ""?
  3. Assumindo que na chamada inicial o parâmetro d é um inteiro natural e que r é a string vazia "", explique o que calcula esta função.

 

Ex. Erros.

Avalie cada uma das expressões seguintes, observe as mensagens de erro resultantes e:

  1. Explique cada uma delas.

  2. Proponha uma correção, i.e. uma expressão correta que resolva o problema detetado.

    Tenha em atenção que o local assinalado para o erro é o local em que esse é detetado. Nem é sempre o local onde o erro tem origem!

     


 

Ex. Tipo e valor.

Dê o tipo e o valor das seguintes expressões OCaml. No caso de erro, explique a origem e dê uma possível correção.

 


 

Ex. Qual tipo?

Para cada uma das expressões seguintes, indicar, das escolhas possíveis, qual é o tipo certo.

  1. let f (x:int) = x + 1

    • int -> int

    • int -> int -> int

    • int -> unit

    • unit -> int -> int

  2. let x = 1

    • int -> int

    • int

    • unit -> int

    • ERROR

  3. let x y = y + 1

    • int -> int

    • int -> int -> int

    • ERROR

  4. let f x y = x +. y

    • int -> int -> int

    • unit -> int -> int -> int

    • float -> float -> float

    • int -> int -> float

  5. let f1 x y = Printf.printf "%d" x; y + 3

    • int -> int -> unit -> int

    • int -> int -> int

    • unit -> int -> unit -> int

    • unit -> int -> int


 

Ex. Verdade ou falso?

Verdade ou falso, as expressões seguintes estão bem tipificadas.

  1. let s1 = "a" + "b"

    • Verdade

    • Falso

  2. let s2 = "a" ^ "b"

    • Verdade

    • Falso

  3. let s3 = "a" ^ 'b'

    • Verdade

    • Falso

  4. let s4 = 'a' ^ 'b'

    • Verdade

    • Falso


 

Ex. Qual o tipo?

Dê o tipo das funções seguintes:

  1. let f x = if x = 2 then Printf.printf "x = 2" else Printf.printf "x <> 2"

    • int -> int -> unit

    • int -> int -> unit -> unit

    • int -> unit

    • unit

    • ERROR

  2. let f x y = if x = 2. then x else y+3

    • int -> int -> int

    • float -> int -> float -> int

    • float -> int -> unit

    • ERROR

  3. let f x = let y = x +. 4. /. 10. in if y > 3.1 then y else 3.

    • int -> int

    • float -> unit -> float

    • float -> float

    • ERROR

  4. let f = (if 2 > 3 then true else true) || false

    • bool -> bool

    • bool

    • int -> int -> bool

    • ERROR


 

Ex. Tipagem.

Considere a seguinte definição: let a,b = (10, "hello")

  1. Dê o tipo e o valor de a?

    • int e 10

    • string e "hello"

    • Erro: faltam parêntesis

  2. Dê o tipo e o valor de b?

    • int e 10

    • string e "hello"

    • Erro: faltam parêntesis


 

Ex. Manipulação de tuplos

Considere a seguinte definição: let n1 = (1,2,3,4,5)

Como aceder exclusivamente ao quarto elemento de n1?


 

Ex. Chamadas à funções.

Seja f uma função do tipo (string * string) -> string

Expressão seguinte corresponde a uma chamada correta da função f?