Sök…


Syntax

  • s är ett exempel på ^a du vill acceptera vid kompileringstid, vilket kan vara allt som implementerar de medlemmar du faktiskt ringer med syntaxen.
  • ^a liknar generiska som skulle vara 'a (eller 'A eller 'T till exempel) men dessa är kompileringstiden upplöst och möjliggör allt som passar alla önskade användningar inom metoden. (inga gränssnitt krävs)

Enkel användning för allt som har en längdmedlem

let inline getLength s = (^a: (member Length: _) s)
//usage:
getLength "Hello World" // or "Hello World" |> getLength
// returns 11

Klass, gränssnitt, inspelningsanvändning

// 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)

Statisk medlemssamtal

detta accepterar alla typer med en metod som heter GetLength som inte tar något och returnerar en int:

((^a : (static member GetLength : int) ()))



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow