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 uhozzáfűzésével készíti uint32 el az a-t , a rendszer a típusokat abé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.

Lásd még