2012-06-28 7 views
5

Rozumiem kleszcza oznaczać parametru rodzajowego, jak w:Jaka jest różnica między ogólnym znaczącego "i symbolem^w F # metoda podpisów

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

ale co daszek oznaczać, na przykład:

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

'' 'są rozwiązywane w czasie wykonywania (generics); '^' są rozwiązywane podczas kompilacji. Zobacz [Statycznie rozwiązane parametry typów] (http://msdn.microsoft.com/en-us/library/dd548046.aspx). – ildjarn

+0

ildjarn, dlaczego nie dodasz tego jako odpowiedzi, a nie jako komentarza. Wydaje mi się to poprawne. –

+0

Po prostu łączenie z dokumentacją bez dodawania szczegółów stanowi słabą odpowiedź, a nie mam ochoty dodawać szczegółów w tej chwili. ;-] – ildjarn

Odpowiedz

5

Szczegółowy podpis jest:

Seq.average: SEQ <^t> ->^T (^ T wymaga z członkiem statyczne (+) i^T z człon statyczny DivideByInt i^T o statyczne członek Zero)

przeciwieństwie Seq.append, Seq.average potrzebuje trochę więcej ograniczeń dotyczących rodzaju elementów. Szczególnie:

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

Jak widać, zarówno (+), DivideByInt i Zero są wymagane aby Seq.average<^T> sens.

Przydatne informacje na temat leków generycznych można znaleźć hereMSDN.

+0

Dzięki za wyjaśnienia. Usunąłem go, aby skrócić przykład i nie powinien. –

6

daszek oznacza, że ​​parametr typu musi być statycznie rozwiązany, ponieważ zazwyczaj istnieją szczególne ograniczenia dotyczące rodzaju, które muszą być spełnione, a które nie mogą być wyrażone w normalnym metadanych .NET. Na przykład nie można wywołać Seq.average "test", mimo że "test" jest to, że nie obsługuje niezbędnych operacji arytmetycznych.

Te statycznie rozdzielane zmienne typu powstają tylko z definicji o kodzie inline, a gdy taka funkcja jest używana, jej treść jest wstawiona tak, że kompilator może wstawić właściwe instrukcje właściwe dla określonego typu.

+0

Może być dobrze, aby dać szybkie notatki na temat apostrofu. Nie potrzeba dużej ilości szczegółów, ale jest to przydatne dla osób, które nie wiedzą zbyt wiele o generykach. – Guvante

0

Chociaż, jak inni zwrócili uwagę, umownie ^T jest używany z inline i 'T nie znaczy, że dwa są wymienne (czasami?).

Więc, technicznie rzecz biorąc, odpowiedź na twoje pytanie brzmi "nie ma różnicy".

kvb zwrócił uwagę: tam jest różna od. Ale nie jest tak jednoznaczny, jak wskazują inne odpowiedzi. W niektórych przypadkach, dwa wymienne, np

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

lub

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

Konwencja jest jasne, podczas gdy realizacja nie jest.

+0

Nie sądzę, że to prawda - zobacz, co się stanie, jeśli spróbujesz wykonać 'let f (x:^t) = x' i' let f (x: 't) = x'. – kvb

+0

Jestem zdezorientowany co do efektu "^". Działa to w taki sam sposób: 'let add (x:^T) (y:^T) = x + y'. – Daniel

+0

Działa to również: 'let f (x:^t) = x * x' – Daniel

Powiązane problemy