2016-08-08 12 views
5

Obecnie uczę się F # z bezpłatnym zasobem online. Ponieważ jestem ciekawy i staram się zastosować wyuczone rzeczy w kilku drobnych ćwiczeniach, często sięgam po dokumentację MSDN F #.Zrozumienie podpisów funkcji dokumentacji F #

Ale dokumentacja wydaje mi się naprawdę zagadkowa. Weź to documentation page dla funkcji pown na przykład. Użycie jest bardzo proste, ale nie rozumiem podpisu funkcji:

// Signature: 
pown : ^T -> int -> ^T (requires ^T with static member One and ^T with static member op_Multiply and ^T with static member (/)) 

Czy ktoś może mi wyjaśnić, co się następujące rzeczy są o?

  1. Co robi^(Circumflex) przed T?
  2. Co oznacza "T"? Czy jest to rodzaj ogólny?
  3. Co robi podwójny -> czy?
  4. Co robią oświadczenia wymagające?

Mam nadzieję, że nie jest to zbyt wiele do omówienia w jednej odpowiedzi.

Odpowiedz

8
  1. Oznacza to, że T jest statically resolved type parameter w przeciwieństwie do zwykłego typu parametru rodzajowe (patrz także 4 poniżej).
  2. Tak.
  3. -> jest konstruktorem typu dla funkcji i jest prawostobiega, więc ta część jest równoważna ^T -> (int -> ^T). Innymi słowy, jeśli przekażesz tej funkcji argument typu ^T, otrzymasz z powrotem funkcję od int do ^T. Tak więc pown 2 jest funkcją 2 x, gdzie moc nie została jeszcze przekazana. I pown 2 8 jest taki sam jak (pown 2) 8: jest to 2 .
  4. W momencie wywołania, niezależnie od rodzaju betonu zastępuje się ^T, statycznie musi spełniać te wymagania. Możesz więc zadzwonić pod numer pown 2 8 (ponieważ int obsługuje te operacje), ale nie pown "test" 8 (ponieważ pown "test" 8 (nie).
+0

Dziękuję za link, wyjaśnia, co "T robi tak samo! –

6

Jest kilka rzeczy, które się tam pojawiają, więc na początek polecam Ci podejście do podpisów w F #. Przede wszystkim zignoruj ​​okalek - mentalnie zastąp tam kleszcza. Wtedy możesz zignorować "wymaganie" w niepełnej krótkiej historii, jest tam ze względu na circumflex.

Więc po tym, trzeba mieć podpis takiego:

// Signature: 
pown : 'T -> int -> 'T 

'T jest typ rodzajowy - wielkie 'T jest standardem .NET, C# zwykle wykorzystuje małe 'a, 'b itd. Co to jest podpis opisuje funkcja, która pobiera 'T i int i zwraca wartość 'T. Typ po ostatniej -> jest "typem zwrotu" funkcji - przynajmniej jest to przydatny sposób na przemyślenie tego na samym początku.

W rzeczywistości jest trochę więcej - w F # funkcje są curry (i częściowo stosowane domyślnie), więc to, co naprawdę masz, to funkcja, która pobiera 'T i zwraca funkcję podpisu int -> 'T - w którym momencie jasne jest, dlaczego masz podwójne ->.

I rzeczą okalającą jest statycznie rozdzielony typ - widzę, że @kvb podał więcej szczegółów na ten temat. Dobrze jest mieć świadomość, że istnieje, ale jest to coś, co rzadko jest używane w praktyce (zobaczysz to na podstawowych funkcjach numerycznych i operatorach).

+1

Wiele strzałek ma dużo więcej sensu, gdy wiemy, że funkcje są wykonywane, dzięki! –