Scusate, non potrei immaginare alcun titolo migliore per la domanda, quindi leggete in anticipo. Immaginate di avere un tipo di famiglia chiuso che associa ogni tipo ad esso è corrispondente Maybe
tranne se stessi maybes:Famiglie di tipi chiusi e tipi di funzione sconosciuti
type family Family x where
Family (Maybe x) = Maybe x
Family x = Maybe x
Possiamo anche dichiarare una funzione che utilizza quel tipo di famiglia:
doMagic :: a -> Family a
doMagic = undefined
exampleA = doMagic $ Just()
exampleB = doMagic $()
Giocando con esso in GHCi dimostra che è ok per valutare il tipo di questa applicazione funzione:
*Strange> :t exampleA
exampleA :: Maybe()
*Strange> :t exampleB
exampleB :: Maybe()
la domanda è se è possibile prevedere eventuali implementati sulla funzione doMagic
eccetto undefined
? Diciamo per esempio che mi piacerebbe racchiudere ogni valore in un costruttore Just
, ad eccezione di Maybes che dovrebbe rimanere intatto, come potrei farlo? Ho provato a utilizzare i typeclass, ma non sono riuscito a scrivere una firma compilabile per la funzione doMagic se non si utilizzano famiglie di tipo chiuso, qualcuno potrebbe aiutarmi per favore?
In un linguaggio digitato dinamicamente 'doMagic x = Just undefined' rispetterebbe anche i tipi. In teoria, un sistema di tipi potrebbe consentirlo (ma sarebbe davvero utile?). A proposito, l'esempio che descrivi, se fai cose diverse a seconda del tipo concreto 'a', richiederebbe informazioni di tipo in fase di esecuzione, mentre Haskell è stato progettato per consentire la cancellazione del tipo (nessuna informazione di tipo in fase di esecuzione). Si potrebbe ottenere qualcosa vicino usando una classe di tipo, però. – chi
Inoltre, la domanda sembra correlata a "qual è il teorema _ libero di un tipo in presenza di famiglie di tipi chiuse?". – chi