Rozważmy mam dwie różne bibliotecznych typy:Inline funkcja i typ rozszerzenie
type Foo = { foo : string }
type Bar = { bar : int32 }
Chcę zaimplementować funkcję rodzajowe zoo
który będzie działał zarówno dla Foo
lub Bar
przypadkach. Nie mogę zmienić Foo
i Bar
, ponieważ są one częścią kodu biblioteki.
Oto moja pierwsza próba z wykorzystaniem rozszerzeń typu i funkcji inline jak wyjaśniono here:
// Library.fs
module Library
type Foo = { foo : string }
type Bar = { bar : int32 }
// Program.fs
type Foo with
static member zoo (f : Foo) = "foo"
type Bar with
static member zoo (b : Bar) = "bar"
let inline zoo (x : ^t) =
(^t : (static member zoo : ^t -> string) x)
let f = zoo { foo = "1" } // error FS0001: The type 'Foo' does not support the operator 'zoo'
Dlaczego nie inline definicja funkcja polega na rozszerzeniach typu? Jak mogę rozwiązać problem bez zmiany początkowych definicji typów Foo
i Bar
?