In Haskell, esistono due modi per fornire un alias per i tipi: type
e newtype
. type
fornisce un tipo sinonimi, che significa che il tradurre viene considerata dal tipo correttore come esattamente lo stesso del tipo di originale:Qual è l'equivalente di C# al nuovo tipo di Haskell?
type UserId = Int
hasAccess :: UserId -> Bool
hasAccess id = {-- stuff --}
-- Elsewhere in the program
login :: Int -> Bool
login n = hasAccess n -- Typechecker won't complain
Un newtype
è simile, ma è considerato per il tipo di controllo come un tipo diverso :
newtype UserId = UserId Int
hasAccess :: UserId -> Bool
hasAccess (UserId id) = {-- stuff --}
-- Elsewhere in the program
login :: Int -> Bool
login n = hasAccess n -- Typechecker will complain, n isn't a UserId !
In C#, è possibile definire il tipo di sinonimi con un alto livello using
dichiarazione:
using UserId = Int;
Tuttavia, un alias di tipo fortemente controllato e controllato dal compilatore non sembra essere presente in C# per impostazione predefinita. Ho esaminato la generazione automatica del codice con i modelli T4 e CodeDOM per generare un wrapper di classe, ma non so davvero come potrei integrarli in modo pulito nel mio flusso di programmazione.
Idealmente, vorrei poter dire su un livello superiore:
// Something like this?
using Int.UserId;
/* Elsewhere */
var id = new UserId(5);
public bool HasAccess(UserId id)
{
/* Stuff */
}
Questa calci generazione del codice in marcia al momento della compilazione. Se ciò non è possibile o fornisce un problema di pollo e uova per IntelliSense, un'opzione di compilazione automatica che viene eseguita ogni x minuti (o un pulsante o qualsiasi altra cosa) sarebbe piacevole.
Puoi fornire qualche informazione sul perché vuoi farlo? –
Perché vuoi compilare il tuo codice ogni x minuti? – Georg
A cosa serve nascondere un tipo sotto un altro nome di tipo? – Franck