Ho trovato qualcosa che non capisco davvero mentre lavoro su un progetto ocaml
.programmazione modulare in ocaml
Supponiamo di utilizzare entrambi i moduli Array
e List
della libreria standard OCaml. Entrambi implementano la funzione length
ma hanno tipi diversi. Nel modulo List
, questo è il suo tipo:
length: a' list -> int
E nel modulo Array
, ha il tipo:
length: a' array -> int
Ma poi ho voluto utilizzare entrambi i moduli nello stesso modulo che ero attuazione, tramite la parola chiave open
:
open List
open Array
Quando ho provato ad utilizzare la funzione length
su una lista, ho avuto un errore di tipo durante la compilazione.
Poiché OCaml è un linguaggio fortemente tipizzato staticamente, mi chiedo perché il compilatore non sapesse che volevo la funzione di lunghezza del modulo elenco poiché ho dichiarato che stavo usando entrambi.
"Mi chiedo perché il compilatore non sapeva che volevo la funzione di lunghezza del modulo elenco poiché ho dichiarato che stavo usando entrambi" Sì, ma quale sarebbe il tipo di 'divertimento s -> lunghezza s' in questo contesto allora? –
In base alla risposta di jrouquie, sarà 'a 'array -> int' –
Esattamente, ma nel caso di un ipotetico compilatore OCaml che tentasse di indovinare, non ci sarebbe un singolo tipo più generale nel sistema di tipo OCaml per la funzione. Potresti essere interessato alla soluzione di Haskell per questo fastidio, classi di tipi: http://www.haskell.org/tutorial/classes.html –