Odvození typu
Toto téma popisuje, jak kompilátor jazyka F# odvodí typy hodnot, proměnných, parametrů a návratových hodnot.
Odvození typu obecně
Myšlenka odvození typu spočívá v tom, že nemusíte zadávat typy konstruktorů jazyka F#, s výjimkou případů, kdy kompilátor nemůže tento typ jednoznačně odvodit. Vynechání explicitních informací o typu neznamená, že jazyk F# je dynamicky napsaný jazyk nebo že hodnoty v jazyce F# jsou slabě napsané. Jazyk F# je staticky napsaný jazyk, což znamená, že kompilátor během kompilace odvodí přesný typ každého konstruktoru. Pokud kompilátor nemá dostatek informací k odstranění typů jednotlivých konstruktorů, musíte zadat další informace o typu, obvykle přidáním explicitních poznámek k typům někam do kódu.
Odvození parametrů a návratových typů
V seznamu parametrů nemusíte zadávat typ každého parametru. A přesto je jazyk F# staticky napsaný, a proto každá hodnota a výraz má v době kompilace určitý typ. U typů, které explicitně nezadáte, kompilátor odvodí typ na základě kontextu. Pokud typ není zadán jinak, je odvozen jako obecný. Pokud kód používá hodnotu nekonzistentně, tak, že neexistuje žádný odvozený typ, který splňuje všechny použití hodnoty, kompilátor hlásí chybu.
Návratový typ funkce je určen typem posledního výrazu funkce.
Například v následujícím kódu jsou typy parametrů a b
návratový typ odvozeny, int
protože literál 100
je typu int
.a
let f a b = a + b + 100
Odvození typů můžete ovlivnit změnou literálů. Pokud přidáte 100
uint32
příponu u
, typy b
a
, a návratová hodnota se uint32
odvodí na hodnotu .
Odvození typu můžete ovlivnit také pomocí jiných konstruktorů, které naznačují omezení typu, jako jsou funkce a metody, které pracují pouze s určitým typem.
Můžete také použít explicitní poznámky k typům na parametry funkce nebo metody nebo na proměnné ve výrazech, jak je znázorněno v následujících příkladech. Pokud dojde ke konfliktům 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
Návratovou hodnotu funkce můžete také explicitně zadat zadáním poznámky typu za všemi parametry.
let addu1 x y : uint32 =
x + y
Běžným případem, kdy je poznámka typu užitečná u parametru, 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á generalizace a může to být účinná pomoc při psaní obecného kódu bez zvýšení složitosti.
Následující funkce například kombinuje dva parametry libovolného typu do řazené kolekce členů.
let makeTuple a b = (a, b)
Typ se odvozuje tak, aby byl
'a -> 'b -> 'a * 'b
Další informace
Odvození typu je podrobněji popsáno ve specifikaci jazyka F#.