Mi è appena venuto in mente che i generici di F # non sembrano accettare valori costanti come "parametri modello".Nessun F # generico con "argomenti modello" costanti?
Supponiamo di voler creare un tipo RangedInt
tale che si comporti come un int ma è garantito che contenga solo un sottointervallo di valori interi.
Un possibile approccio potrebbe essere un'unione discriminata, simile a:
type RangedInt = | Valid of int | Invalid
Ma questo non funziona neanche, in quanto non v'è alcuna "memoria specifica il tipo di informazioni range". E 2 istanze RangedInt dovrebbero essere di tipo diverso, anche se l'intervallo è diverso.
Essere ancora un po 'C++ infestata sarebbe simile a:
template<int low,int high>
class RangedInteger { ... };
Ora la domanda, derivante è duplice:
- Mi sono perso qualcosa e valori costanti per F # generics esiste?
- Se non mi mancasse quello, quale sarebbe il modo idiomatico per realizzare un tale
RangedInt<int,int>
in F #?
Dopo aver trovato Tomas Petricek's blog about custom numeric types, l'equivalente alla mia domanda per questo articolo del blog sarebbe: E se non ha fatto un, ma un tipo di famiglia IntegerZn<int>
personalizzato IntegerZ5
?
In effetti, ho passato un po 'di tempo ieri su tipi dipendenti e ho trovato una mutazione ML chiamata ATS (non riuscivo a farlo funzionare, però). L'idea è di avere un linguaggio che combini programmazione logica e solutori in fase di compilazione in modo che le persone possano scrivere prove per il loro codice - quelli che vengono rimossi in fase di compilazione dopo aver verificato il codice con esso. La mia idea di F # era fondamentalmente: quanto lontano posso andare in quella direzione usando un linguaggio mainstream moderno? – BitTickler