Поиск…


Синтаксис

  • s - это экземпляр ^a вы хотите принять во время компиляции, что может быть тем, что реализует члены, которые вы на самом деле вызываете, используя синтаксис.
  • ^a аналогичен дженерикам, которые были бы 'a (или 'A или 'T например), но они разрешены во время компиляции и допускают все, что соответствует всем запросам в методе. (не требуется никаких интерфейсов)

Простое использование для всего, что имеет член длины

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

Класс, интерфейс, использование записи

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

Вызов статического участника

это будет принимать любой тип с методом GetLength который ничего не принимает и возвращает int:

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



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow