Sto implementando un sistema gentile per un nuovo linguaggio di programmazione funzionale e sto attualmente scrivendo la funzione per unificare due tipi. Ci sono quattro casi due in considerazione:È possibile ottenere l'errore di tipo infinito in Haskell 98?
+---------+---------+-------------------------------------------------------+
| k1 | k2 | action |
+=========+=========+=======================================================+
| var | var | k1 := k2^k2 := k1 |
+---------+---------+-------------------------------------------------------+
| var | non var | if (!occurs(k1, k2)) k1 := k2 |
+---------+---------+-------------------------------------------------------+
| non var | var | if (!occurs(k2, k1)) k2 := k1 |
+---------+---------+-------------------------------------------------------+
| non var | non var | ensure same name and arity, and unify respective args |
+---------+---------+-------------------------------------------------------+
- Quando sia
k1
ek2
sono variabili poi sono istanziati gli uni agli altri. - Quando solo
k1
è una variabile, viene istanziata ak2
iffk1
non si verifica ink2
. - Se solo
k2
è una variabile, viene istanziato ak1
se non si verificak2
ink1
. - Altrimenti verifichiamo se
k1
ek2
hanno lo stesso nome e arità e unificare i rispettivi argomenti.
Per il secondo e il terzo caso è necessario implementare il controllo di verifica in modo da non rimanere bloccati in un ciclo infinito. Tuttavia, dubito che un programmatore sia in grado di costruire un tipo infinito.
In Haskell, è facile da costruire un tipo di infinito:
let f x = f
Tuttavia, non sono stati in grado di costruire un tipo infinito non importa quanto duramente ho provato. Nota che non ho usato alcuna estensione di lingua.
La ragione per cui sto chiedendo questo è perché se non è possibile costruire un tipo infinito, allora non mi preoccuperò nemmeno di implementare il controllo dei casi nel mio sistema gentile.
E poi qualche povero linfa gestisce comunque e ottiene un utile "accadde l'impossibile" – Cubic
Perché la tua domanda tagged Prolog e OCaml? Da quello che capisco leggendolo, si tratta solo di Haskell e della tua nuova lingua. – Kevin
@ Kevin: entrambi sono tenui, ma non del tutto estranei. OCaml ha un tipo di sistema di tipi molto simile a Haskell e Prolog è dove originano le idee di unificazione e il controllo dei controlli (per quanto ne so). In un certo senso, questo tipo di controllo ortografico è molto simile alla gestione di un programma Prolog. –