2012-06-28 18 views
5

ho capito il segno di spunta per indicare un parametro generico, come in:Qual è la differenza tra il significante generica 'e il simbolo^in F # metodo firme

Seq.append : seq<'T> -> seq<'T> -> seq<'T> 

ma che cosa il cursore significa, come in:

Seq.average : seq<^T> -> ^T 
+2

'' 'sono risolti in fase di esecuzione (generici); '^' sono risolti in fase di compilazione. Vedere [Parametri di tipo risolti staticamente] (http://msdn.microsoft.com/en-us/library/dd548046.aspx). – ildjarn

+0

ildjarn, perché non dovresti aggiungere questo come risposta e non come commento. Mi sembra corretto. –

+0

Perché il semplice collegamento alla documentazione senza aggiungere dettagli non è una buona soluzione e non ho voglia di aggiungere dettagli al momento. ; -] – ildjarn

risposta

5

La firma dettagliato è:

Seq.average: ss <^T> ->^T (richiede^T con membro statico (+) e^T con membro statico DivideByInt e^T con membro statico zero)

differenza Seq.append, Seq.average bisogno di alcuni altri vincoli sul tipo di elementi. In particolare:

       _ DivideByInt (s1 + s2 + ... + sn) n where n <> 0 
Seq.average {s1; s2;...; sn} =/
           \_ ^T.Zero where n = 0 

Come si può vedere, sia (+), DivideByInt e Zero sono richiesti in modo che Seq.average<^T> ha un senso.

Informazioni utili sui farmaci generici sono disponibili hereMSDN.

+0

Grazie per il chiarimento. L'ho rimosso per accorciare l'esempio e non dovrebbe avere. –

6

il cursore indica che il parametro tipo deve essere risolto staticamente, solitamente perché ci sono particolari limitazioni sul tipo che deve essere soddisfatto e che non può essere espresso in normale metadati NET. Ad esempio, non è possibile chiamare Seq.average "test" anche se "test" è un seq<char>, perché char s non supportano le operazioni aritmetiche necessarie.

Queste variabili di tipo risolte staticamente derivano solo dalle definizioni inline e quando tale funzione viene utilizzata, il suo corpo è in linea in modo che il compilatore possa inserire le istruzioni specifiche specifiche del tipo.

+0

Potrebbe essere utile dare una breve nota sull'apostrofo. Non serve molti dettagli, ma è utile per le persone che non sanno molto dei farmaci generici. – Guvante

0

Anche se, come altri hanno sottolineato, per convenzione ^T viene utilizzato con inline e 'T non è, i due sono intercambiabili (talvolta?).

Quindi, tecnicamente, la risposta alla tua domanda è "non c'è differenza".

kvb sottolineato: ci è una differenza. Ma non è così chiaro come indicano le altre risposte. In alcuni casi, i due sono intercambiabili, per esempio,

let inline add (x:^T) (y:^T) = x + y 
let inline add (x:'T) (y:'T) = x + y 

o

let f (x:^T) = !x 
let f (x:'T) = !x 

La convenzione è chiaro, mentre l'implementazione non è.

+0

Non penso sia giusto - guarda cosa succede se provi ad eseguire 'let f (x:^t) = x' e' let f (x: 't) = x'. – kvb

+0

Sono confuso sull'effetto di '^'. Questo funziona allo stesso modo: 'lascia aggiungere (x:^T) (y:^T) = x + y'. – Daniel

+0

Funziona anche: 'let f (x:^t) = x * x' – Daniel

Problemi correlati