Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- type IDuck =
- abstract member Quack: unit -> unit
- abstract member Quack: string -> unit
- let inline (|IsDuck|) x =
- let quackDefault = fun () -> (^a: (member Quack: unit -> unit) x)
- let quack = fun s -> (^a: (member Quack: string -> unit) x, s)
- { new IDuck with
- member this.Quack() = quackDefault()
- member this.Quack(s: string) = quack s }
- type NominalDuck() =
- interface IDuck with
- member this.Quack() = printfn "Quack!"
- member this.Quack(s: string) = printfn "Quack, %s!" s
- type StructuralDuck() =
- member this.Quack() = printfn "Кря!"
- member this.Quack(s: string) = printfn "Кря, %s!" s
- let inline quack (IsDuck x) = x.Quack()
- let nominalDuck = NominalDuck()
- let structDuck = StructuralDuck()
- quack (nominalDuck :> IDuck) |> ignore
- quack structDuck |> ignore
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement