Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2018
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 0.82 KB | None | 0 0
  1. type IDuck =
  2.   abstract member Quack: unit -> unit
  3.   abstract member Quack: string -> unit
  4.  
  5. let inline (|IsDuck|) x =
  6.   let quackDefault = fun () -> (^a: (member Quack: unit -> unit) x)
  7.   let quack = fun s -> (^a: (member Quack: string -> unit) x, s)
  8.  
  9.   { new IDuck with
  10.       member this.Quack() = quackDefault()
  11.       member this.Quack(s: string) = quack s }
  12.  
  13. type NominalDuck() =
  14.   interface IDuck with
  15.     member this.Quack() = printfn "Quack!"
  16.     member this.Quack(s: string) = printfn "Quack, %s!" s
  17.    
  18. type StructuralDuck() =
  19.   member this.Quack() = printfn "Кря!"
  20.   member this.Quack(s: string) = printfn "Кря, %s!" s
  21.  
  22. let inline quack (IsDuck x) = x.Quack()
  23.  
  24. let nominalDuck = NominalDuck()
  25.  
  26. let structDuck = StructuralDuck()
  27.  
  28. quack (nominalDuck :> IDuck) |> ignore
  29. quack structDuck |> ignore
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement