Concettualmente, pensavo ai tipi come insiemi. Tuttavia, penso di aver visto persone che desiderano distinguere i tipi A , B anche se rappresentano raccolte di valori identiche. Quindi ho capito che una migliore definizione di tipo è una coppia (type_name, set) , in cui due tipi diversi non possono avere lo stesso primo elemento.
Poi mi sono imbattuto in una situazione diversa. Ho pensato che una funzione è solo un insieme di coppie (x, y) . Ma poi una funzione A->B (dove A, B rappresenta le stesse raccolte di valori) non può essere distinta da una funzione B->B o A->A o B->A , e ancora penso di aver visto persone che vogliono distinguerle . Quindi, come posso definire una funzione? Come una tupla (A, B, (x1, y1), (x2, y2), ...) , dove ogni elemento di A appare esattamente una volta come il primo elemento nelle coppie, e dove ogni secondo elemento è di tipo B ?
E il tipo F che rappresenta tutte le funzioni che richiede A->B è quindi (F, ((A, B, (a1, b11), (a2, b12), ...), (A, B, (a1, b21), (a2, b22), ...), (A, B, (a1, b31), (a2, b32), ...))) , dove a1, ... sono tutti i valori rappresentati da A e b?1, b?2, ... , per qualsiasi ? , sono alcuni di i valori rappresentati da B .
Sembra tutto piuttosto ingombrante, mi manca qualcosa?