Ho un ADT che rappresenta l'AST per un linguaggio semplice:Conversione di un AST non tipizzata per un semplice linguaggio digitato in un GADT
data UTerm = UTrue
| UFalse
| UIf UTerm UTerm UTerm
| UZero
| USucc UTerm
| UIsZero UTerm
Questa struttura di dati può rappresentare termini non validi che non seguono le regole di tipo della lingua, come UIsZero UFalse
, quindi mi piacerebbe usare un GADT che fa rispettare ben typedness:
{-# LANGUAGE GADTs #-}
data TTerm a where
TTrue :: TTerm Bool
TFalse :: TTerm Bool
TIf :: TTerm Bool -> TTerm a -> TTerm a -> TTerm a
TZero :: TTerm Int
TSucc :: TTerm Int -> TTerm Int
TIsZero :: TTerm Int -> TTerm Bool
il mio problema è quello di digitare controllare un UTerm e convertirlo in un Tterm. Il mio primo pensato era UTerm -> Maybe (TTerm a)
, ma questo naturalmente non funziona perché non è valido per tutti a
s. Non so nemmeno quale sarebbe il tipo, perché non sappiamo se a
sarà Int o Bool. Poi ho pensato di scrivere un differente funzione controllo di tipo per ciascuno dei possibili valori di a
:
import Control.Applicative
typecheckbool :: UTerm -> Maybe (TTerm Bool)
typecheckbool UTrue = Just TTrue
typecheckbool UFalse = Just TFalse
typecheckbool (UIsZero a) = TIsZero <$> typecheckint a
typecheckbool _ = Nothing
typecheckint :: UTerm -> Maybe (TTerm Int)
typecheckint UZero = Just TZero
typecheckint (USucc a) = TSucc <$> typecheckint a
typecheckint (UIf a b c) = TIf <$> typecheckbool a <*> typecheckint b <*> typecheckint c
typecheckint UTrue = Nothing
typecheckint UFalse = Nothing
typecheckint (UIsZero _) = Nothing
Questo funziona per alcuni casi, per un sottoinsieme del linguaggio in cui TSe richiede ai suoi conseguente ed alternativi sono Ints (Ma lo TIf TTrue TFalse TTrue
è in realtà totalmente valido) e dove conosciamo il tipo di destinazione dell'espressione siamo digitando.
Qual è il modo corretto per convertire da un UTerm a un TTerm?
A proposito, si potrebbe certamente aggiungere un caso 'typecheckbool (UIf a b c)' per indirizzare il problema "Ma' TIf TTrue TFalse TTrue' è in realtà totalmente valido ". –