Attualmente sto lavorando per espandere le capacità del mio sistema di gestione del mio linguaggio di programmazione per animali domestici e mi sono imbattuto in un'area interessante in cui la mia ricerca sui sistemi di tipi di altre lingue non mi ha portato prima.
Come sfondo, il mio linguaggio è un linguaggio funzionale agli oggetti con tipi statici e inferenza di tipo parziale. Il linguaggio supporterà (ma non ancora) entrambe queste funzionalità:
- funzioni il cui comportamento dipende dal tipo di runtime di tutti i loro argomenti (cioè multi-metodi)
- tipi di unione, vale a dire che un valore può avere uno di molti tipi, i quali sono tracciati in modo trasparente in fase di esecuzione (simile a un tipo di somma ma senza bisogno di costruire esplicitamente o dichiarazione di quali tipi possono essere usati).
Data questa combinazione, il tipo di una funzione è interessante. Ad esempio, se ho un valore definito così:
v : union (int, string) = randomInt & 1 == 0 ? 1 : "hello"
Posso quindi applicarlo a qualsiasi funzione che accetta int o string per il suo primo argomento. Questo potrebbe significare una funzione che accetta un tipo di unione:
fn1 (p : union (int, string)) { p + 1; }
Ma potrebbe anche essere un multi-metodo definito per accettare entrambi i tipi:
fn2 (p : int) { "Integer: " + p; },
(p : string) { p.length }
Mentre potrei descrivere i tipi di queste funzioni usando un'unione dei loro parametri e risultato, ad esempio (usando una notazione Haskell appropriatamente estesa):
fn1 :: union (int, string) -> union (int, string)
(e lo stesso tipo di fn2) questo perde informazioni, cioè il fatto che fn1 mantiene il tipo del suo argomento mentre fn2 scambia tra i due tipi.
Qualcuno ha visto una lingua che tiene traccia dei tipi di funzione in questo modo? In tal caso, che tipo di notazione utilizza per la combinazione di diversi argomenti e tipi di risultati e le loro interazioni? C'è un nome per il tipo di funzione di cui stiamo parlando? E vale la pena farlo, o dovrei semplicemente permettere che le informazioni vengano perse?
Un altro pensiero interessante: la funzione fn2 può essere vista come una combinazione di due funzioni, una di tipo int- > string e l'altro string- > Int. Il mio primo pensiero è che il tipo di funzione è un'unione di questi, ma questo è ovviamente sbagliato - il mio pensiero attuale è che è in realtà un doppio del tipo di unione, analogo al modo in cui un tipo di prodotto si riferisce a un tipo di somma. Qualche altra idea su questo? Sono sulla buona strada? Esiste un nome standard per questo tipo?