F#
Paramètres de type résolus statiquement
Recherche…
Syntaxe
-
s
est une instance de^a
vous voulez accepter à la compilation, qui peut être tout ce qui implémente les membres que vous appelez réellement en utilisant la syntaxe. -
^a
est similaire aux génériques qui seraient'a
(ou'A
ou'T
par exemple) mais ceux-ci sont résolus à la compilation, et permettent tout ce qui correspond à tous les usages demandés dans la méthode. (pas d'interfaces requises)
Utilisation simple pour tout ce qui a un membre Length
let inline getLength s = (^a: (member Length: _) s)
//usage:
getLength "Hello World" // or "Hello World" |> getLength
// returns 11
Classe, interface, utilisation des enregistrements
// Record
type Ribbon = {Length:int}
// Class
type Line(len:int) =
member x.Length = len
type IHaveALength =
abstract Length:int
let inline getLength s = (^a: (member Length: _) s)
let ribbon = {Length=1}
let line = Line(3)
let someLengthImplementer =
{ new IHaveALength with
member __.Length = 5}
printfn "Our ribbon length is %i" (getLength ribbon)
printfn "Our Line length is %i" (getLength line)
printfn "Our Object expression length is %i" (getLength someLengthImplementer)
Appel de membre statique
Cela acceptera n'importe quel type avec une méthode appelée GetLength
qui ne prend rien et retourne un int:
((^a : (static member GetLength : int) ()))
Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow