Udostępnij za pośrednictwem


Wnioskowanie o typie (F#)

W tym temacie opisano, jak kompilator F# ustala typy wartości, zmienne, parametrów i zwracanych wartości.

Na ogół wpisz wnioskowanie

Pomysł wnioskowanie typu jest, że nie trzeba określać typy konstrukcji F#, z wyjątkiem przypadków, gdy kompilator nie całą pewnością wywnioskowanie typu.Pominięcie informacji jawnie określony typ nie oznacza, że F# jest językiem dynamicznymi czy że wartości F# są słabo wpisane.F# jest językiem statycznymi, co oznacza, że kompilator deduces dokładnego typu dla każdego konstrukcja podczas kompilacji.Jeśli nie jest wystarczająco dużo informacji, kompilator wywnioskowanie typy konstrukcji, wpisz dodatkowe informacje, należy podać zazwyczaj przez dodanie adnotacji jawnie określony typ gdzieś w kodzie.

Wnioskowanie parametrów i zwracanych typów

Na liście parametrów nie trzeba określać typ każdego parametru.I jeszcze, F# jest językiem statycznymi i dlatego co wartość i wyrażenie ma pewne typu w czasie kompilacji.Dla tych typów, które jawnie nie określisz kompilator ustala typ, na podstawie kontekstu.Jeśli typ nie jest inaczej określone, wywnioskować być rodzajowy.Jeśli kod używa wartooci typu niespójnie, w taki sposób, jest nie pojedynczy wywnioskować typu, który spełnia wszystkie zastosowania wartości, kompilator zgłosi błąd.

Zwracany typ funkcji zależy od typu ostatniego wyrażenia w funkcji.

Na przykład w poniższym kodzie, typy parametrów a i b i typ zwracany jest niezamierzone za int ponieważ literał 100 jest typu int.

let f a b = a + b + 100

Wnioskowanie typu może mieć wpływ, zmieniając literałów.Jeśli dokonuje się 100uint32 za pomocą dołączania sufiksów u, rodzaje a, b, i wartość zwracana są ich doszukiwać się uint32.

Może również mieć wpływ wpisz wnioskowanie przy użyciu innych konstrukcji, które pociąga za sobą ograniczenia typu, takie jak funkcje i metody, które działają z określonego typu.

Ponadto można zastosować adnotacje jawnie określony typ do parametrów funkcji lub metody lub zmienne w wyrażeniach, jak pokazano w poniższych przykładach.Błędy powodują, gdy występują konflikty między różne ograniczenia.

// Type annotations on a parameter. 
let addu1 (x : uint32) y =
    x + y

// Type annotations on an expression. 
let addu2 x y =
    (x : uint32) + y

Jawnie można określić wartość zwracaną przez funkcję, dostarczając wskazania typu po wszystkich parametrów.

let addu1 x y : uint32 =
   x + y

Wspólne sprawy, gdzie wskazania typu jest przydatne w parametrze jest, gdy parametr jest typu obiektu i chcesz użyć członka.

let replace(str: string) =
    str.Replace("A", "a")

Automatyczne generalizacji

Jeśli kod funkcji nie jest zależne od typu parametru, kompilator uzna parametr być rodzajowy.Jest to tak zwane Automatyczne generalizacji, i można go potężnym pomocy do pisania kodu rodzajowy bez zwiększania stopnia złożoności.

Na przykład następująca funkcja łączy dwa parametry dowolnego typu do krotki.

let makeTuple a b = (a, b)

Typ jest niezamierzone za

'a -> 'b -> 'a * 'b

Dodatkowe informacje

Wnioskowanie typu jest opisany bardziej szczegółowo w specyfikacji języka F#.

Zobacz też

Inne zasoby

Automatyczna generalizacja (F#)