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
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
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.
Dzięki za wyjaśnienia. Usunąłem go, aby skrócić przykład i nie powinien. –
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.
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
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 są 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.
'' '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
ildjarn, dlaczego nie dodasz tego jako odpowiedzi, a nie jako komentarza. Wydaje mi się to poprawne. –
Po prostu łączenie z dokumentacją bez dodawania szczegółów stanowi słabą odpowiedź, a nie mam ochoty dodawać szczegółów w tej chwili. ;-] – ildjarn