Odvození typu

Toto téma popisuje, jak F# kompilátor odvodí typy hodnot, proměnných, parametrů a vrácených hodnot.

Odvození typu obecně

Účelem odvození typu je, že nemusíte určovat typy F# konstrukcí s výjimkou případů, kdy kompilátor nemůže jednoznačně odvodit typ. Vynechání explicitních informací o typu neznamená F# , že je to dynamicky typový jazyk nebo že F# hodnoty v jsou slabě typované. F#je jazyk staticky typu, což znamená, že kompilátor při kompilaci odvodit přesný typ pro každý konstruktor. Není-li pro kompilátor k dispozici dostatek informací pro odvození typů každé konstrukce, je nutné zadat další informace o typu, obvykle přidáním explicitních anotací typu někam do kódu.

Odvození parametrů a návratových typů

V seznamu parametrů není nutné zadávat typ každého parametru. A dosud F# je jazyk staticky typu, a proto každá hodnota a výraz má v době kompilace určitý typ. Pro typy, které neurčíte explicitně, kompilátor odvodí typ na základě kontextu. Pokud není typ uveden jinak, je odvozena jako obecná. Pokud kód používá hodnotu nekonzistentní, takovým způsobem, že neexistuje žádný odvozený typ, který splňuje všechna použití hodnoty, kompilátor ohlásí chybu.

Návratový typ funkce je určen typem posledního výrazu ve funkci.

Například v a následujícím kódu jsou typy parametrů a b a návratový typ odvoditelné int , protože literál 100 je typu int.

let f a b = a + b + 100

Odvození typu můžete ovlivnit změnou literálů. u b Pokudvytvoříteapřipojením k příponě, jsou typy, a návratové hodnoty odvozeny uint32. 100 uint32

Odvození typu můžete také ovlivnit pomocí jiných konstrukcí, které zaznamenají omezení typu, jako jsou funkce a metody, které pracují pouze s konkrétním typem.

Můžete také použít explicitní anotace typu na parametry Function nebo Method nebo na proměnné ve výrazech, jak je znázorněno v následujících příkladech. Při výskytu konfliktů mezi různými omezeními dojde k chybám.

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

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

Můžete také explicitně zadat návratovou hodnotu funkce poskytnutím anotace typu po všech parametrech.

let addu1 x y : uint32 =
   x + y

Běžný případ, kdy je anotace typu užitečná pro parametr, je, když je parametr typem objektu a chcete použít člena.

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

Automatická generalizace

Pokud kód funkce není závislý na typu parametru, kompilátor považuje parametr za obecný. To se nazývá Automatická generalizacea může to být účinná podpora pro psaní obecného kódu bez zvýšené složitosti.

Například následující funkce kombinuje dva parametry libovolného typu do řazené kolekce členů.

let makeTuple a b = (a, b)

Typ je odvozený.

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

Další informace

Odvození typu je podrobněji popsáno ve specifikaci F# jazyka.

Viz také: