OCaml - rekonstrukcja typów (typ funkcji)

OCaml - rekonstrukcja typów (typ funkcji)
hdw3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 30
0

Jest funkcja

Kopiuj
let rec fold_right f l accu =
	match l with
		[] -> accu
		| a::l -> f a (fold_right f l accu);;

Zadanie polega na tym, aby podać typ funkcji fold_right. No to ja zrobiłem to w ten sposób:

Kopiuj
val l: 'a list
val a: 'a
val accu: 'b
val f: 'a -> 'b -> 'c
val fold_right: ('a->'b->'c) -> 'a list -> 'b -> 'b

Ale kompilator się ze mną nie zgadza. Poprawny wynik to:

Kopiuj
val fold_right : ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b = <fun>

Mój problem polega na tym, że nie wiem w jaki sposób jesteśmy w stanie stwierdzić, że funkcja zwraca typ 'b, a nie jakiś nieznany typ 'c.

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
1

Zauważ że z pattern matchingu wynika że accu oraz wynik funkcji f (a także wynik funkcji fold_right) muszą być tym samym typem, bo w zależności od dopasowania zwracasz jedną albo drugą wartość

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.