Típuskövetkeztetés
Ez a témakör azt ismerteti, hogy az F#-fordító hogyan következtet az értékek, változók, paraméterek és visszatérési értékek típusaira.
Típuskövetkeztetés általánosan
A típuskövetkeztetés lényege, hogy nem kell megadnia az F#-szerkezetek típusait, kivéve, ha a fordító nem tudja meggyőzően levonni a típust. A explicit típusadatok kihagyása nem jelenti azt, hogy az F# egy dinamikusan beírt nyelv, vagy hogy az F# értékei gyengén vannak beírva. Az F# egy statikusan gépelt nyelv, ami azt jelenti, hogy a fordító pontos típust ad az egyes szerkezetekhez a fordítás során. Ha nincs elegendő információ ahhoz, hogy a fordító az egyes szerkezetek típusaira következtetjen, további típusinformációkat kell megadnia, általában explicit típusú széljegyzetek hozzáadásával valahol a kódban.
Paraméter- és visszatérési típusok következtetése
A paraméterlistában nem kell megadnia az egyes paraméterek típusát. Az F# azonban statikusan gépelt nyelv, ezért fordításkor minden érték és kifejezés határozott típussal rendelkezik. A nem explicit módon megadott típusok esetében a fordító a környezet alapján következtet a típusra. Ha a típus nincs másként megadva, a rendszer általánosnak számít. Ha a kód inkonzisztens értéket használ, oly módon, hogy egyetlen kikövetkeztetett típus sem felel meg az érték összes felhasználásának, a fordító hibát jelez.
A függvény visszatérési típusát a függvény utolsó kifejezésének típusa határozza meg.
Az alábbi kódban például a paramétertípusok a
és b
a visszatérési típus mind arra következtetnek int
, hogy a literál 100
típus int
.
let f a b = a + b + 100
A típuskövetkeztetést a literálok módosításával befolyásolhatja. Ha az utótag u
hozzáfűzésével készíti uint32
el az a-t , a rendszer a típusokat a
b
és a visszatérési értéket is kikövetkeztetiuint32
.100
A típuskövetkeztetést más olyan szerkezetek használatával is befolyásolhatja, amelyek a típus korlátozásait jelentik, például olyan függvényeket és metódusokat, amelyek csak egy adott típussal működnek.
Explicit típusú széljegyzeteket is alkalmazhat a függvény- vagy metódusparaméterekre vagy a kifejezések változóira, ahogyan az az alábbi példákban is látható. A hibák akkor következnek be, ha ütközések lépnek fel a különböző kényszerek között.
// Type annotations on a parameter.
let addu1 (x : uint32) y =
x + y
// Type annotations on an expression.
let addu2 x y =
(x : uint32) + y
Egy függvény visszatérési értékét is explicit módon megadhatja, ha az összes paraméter után egy típusjegyzetet ad meg.
let addu1 x y : uint32 =
x + y
Gyakori eset, amikor egy paraméter esetében hasznos a típusjegyzet, ha a paraméter objektumtípus, és tagot szeretne használni.
let replace(str: string) =
str.Replace("A", "a")
Automatikus általánosítás
Ha a függvénykód nem függ egy paraméter típusától, a fordító általánosnak tekinti a paramétert. Ezt automatikus általánosításnak nevezik, és hatékony segítséget jelenthet az általános kód írásához anélkül, hogy növelhető volna az összetettség.
Az alábbi függvény például bármilyen típusú paramétert egyesít egy rekordba.
let makeTuple a b = (a, b)
A típus a következőre lesz következtetve:
'a -> 'b -> 'a * 'b
További információ
A típuskövetkeztetést részletesebben az F# nyelvi specifikációja ismerteti.