Sdílet prostřednictvím


Odvození typu (F#)

Toto téma popisuje, jak kompilátor F# odvodí typy hodnot, proměnné, parametry a vrácené hodnoty.

Zadejte odvození obecně

Představu o odvození typu je, že není nutné zadat typy s výjimkou případů, kdy kompilátor nelze odvodit nezvratně typ konstrukce F#.Vynechání explicitní typ informace neznamená, že F# je dynamicky zadávaný jazyk nebo zadali hodnoty F# budou slabě.F# je staticky zadávané jazyk, což znamená, že kompilátor deduces pro každou konstrukci přesný typ během kompilace.Pokud není dostatek informací pro kompilátor odvodit typy jednotlivých konstrukce, musíte poskytnout další typ informace obvykle přidáním explicitní typ poznámky někde v kódu.

Při odvozování parametrů a návratové typy

V seznamu parametrů není nutné zadat typ každého parametru.Dosud, F# je staticky zadávané jazyk a proto každá hodnota a výraz má v době kompilace určený typ.Pro typy, které explicitně nezadáte kompilátor odvodí typ na základě kontextu.Typ není jinak zadán, je odvodit být obecný.Pokud kód používá hodnotu nekonzistentně, tak se ne jediné odvodit typ, který splňuje všechna použití hodnoty, že kompilátor ohlásí chybu.

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

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

let f a b = a + b + 100

Odvození typu může ovlivnit změnou literály.Pokud provedete 100uint32 přidáním přípony u, typy a, b, a vrácené hodnoty jsou odvodit se uint32.

Můžete také ovlivnit zadejte odvození pomocí jiných neznamená omezení typu, například funkce a metody, které pracují s konkrétní typ konstrukce.

Také můžete použít explicitní typ poznámky na parametry funkce nebo metody nebo proměnné ve výrazech, jak je uvedeno v následujících příkladech.Chyby způsobit případné konflikty mezi různými omezeními.

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

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

Vrácená hodnota funkce také výslovně zadáte poskytující anotace typu po všech parametrů.

let addu1 x y : uint32 =
   x + y

Kde je užitečné pro parametr anotace typu běžný případ je parametr typu objektu a chcete použít člen.

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

Automatické generalizace

Je-li kód funkce není závislá na typu parametru, kompilátor za obecný parametr.To se nazývá Automatické generalizace, a může být účinné podpory bez zvýšení složitosti psaní obecného kódu.

Například následující funkce kombinuje dva parametry typu do n-tice.

let makeTuple a b = (a, b)

Typ je odvodit být

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

Další informace

Odvození typu je popsán podrobněji v specifikaci jazyka F#.

Viz také

Další zdroje

Automatická generalizace (F#)