F#
Параметры статического разрешения
Поиск…
Синтаксис
-
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