11 people like it.
    Like the snippet!
  
  Adding two numbers has never been this awful
  Normally, you'd add two numbers with the '+' operator. But why do that when you can use Type Extensions, custom operations on Computation Expressions, customer operators, and more?
  |  1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
 | module Hoopty =
    [<AutoOpen>]
    module Doopty =
        [<Measure>] type doot
        [<Measure>] type hoopty
        type Ref<'T> with
            member __.ReturnFrom(x) = x
            [<CustomOperation("GIANT_DAD")>]
            member __.Doot(_state: Ref<_>, x) = x
            member __.Yield(x) = ref x
        let inline (?^&>.<) x y = (y, !x) ||> (+)
        let inline derp (x: Ref<_>) y =
            x {
                GIANT_DAD (x ?^&>.< y)
            }
    let inline add x y =
        ref 1000<doot/hoopty>
            {            return! derp (ref x) y
}
printfn "%d" (Hoopty.add 1 2) // 3
printfn "%f" (Hoopty.add 1. 2.) // 3.000000
 | 
Multiple items
type AutoOpenAttribute =
  inherit Attribute
  new : unit -> AutoOpenAttribute
  new : path:string -> AutoOpenAttribute
  member Path : string
Full name: Microsoft.FSharp.Core.AutoOpenAttribute
--------------------
new : unit -> AutoOpenAttribute
new : path:string -> AutoOpenAttribute
Multiple items
type MeasureAttribute =
  inherit Attribute
  new : unit -> MeasureAttribute
Full name: Microsoft.FSharp.Core.MeasureAttribute
--------------------
new : unit -> MeasureAttribute
[<Measure>]
type doot
Full name: Script.Hoopty.Doopty.doot
[<Measure>]
type hoopty
Full name: Script.Hoopty.Doopty.hoopty
member Ref.ReturnFrom : x:'a -> 'a
Full name: Script.Hoopty.Doopty.ReturnFrom
val x : 'a
Multiple items
type CustomOperationAttribute =
  inherit Attribute
  new : name:string -> CustomOperationAttribute
  member AllowIntoPattern : bool
  member IsLikeGroupJoin : bool
  member IsLikeJoin : bool
  member IsLikeZip : bool
  member JoinConditionWord : string
  member MaintainsVariableSpace : bool
  member MaintainsVariableSpaceUsingBind : bool
  member Name : string
  ...
Full name: Microsoft.FSharp.Core.CustomOperationAttribute
--------------------
new : name:string -> CustomOperationAttribute
val __ : Ref<'T>
member Ref.Doot : _state:Ref<'a> * x:'b -> 'b
Full name: Script.Hoopty.Doopty.Doot
val x : 'b
member Ref.Yield : x:'a -> 'a ref
Full name: Script.Hoopty.Doopty.Yield
Multiple items
val ref : value:'T -> 'T ref
Full name: Microsoft.FSharp.Core.Operators.ref
--------------------
type 'T ref = Ref<'T>
Full name: Microsoft.FSharp.Core.ref<_>
val x : 'a ref (requires member ( + ))
val y : 'b (requires member ( + ))
val derp : x:Ref<'a> -> y:'b -> 'c (requires member ( + ))
Full name: Script.Hoopty.Doopty.derp
val x : Ref<'a> (requires member ( + ))
custom operation: GIANT_DAD ('b)
Calls Ref.Doot 
val add : x:'a -> y:'b -> 'c (requires member ( + ))
Full name: Script.Hoopty.add
val x : 'a (requires member ( + ))
val printfn : format:Printf.TextWriterFormat<'T> -> 'T
Full name: Microsoft.FSharp.Core.ExtraTopLevelOperators.printfn
module Hoopty
from Script
  
  
  More information