Arrow Notation via F#
- March 4th, 2011
- Posted in F#
- By ninegrid ⋮⋮⋮
- Write comment
In object oriented programming, a class is a blueprint to create instances of a type.
1: // show me all the blueprints -- reflect over some .NET libs 2: open System 3: open System.IO 4: open System.Reflection 5: 6: // some reflection helpers 7: module Reflect = 8: type Info = 9: | Types of Type 10: | Fields of FieldInfo 11: | Properties of PropertyInfo 12: | Events of EventInfo 13: | Methods of MethodInfo 14: | Constructors of ConstructorInfo 15: 16: let getTypes (x : string) = 17: let asm = Assembly.LoadFrom(x) in asm.GetTypes() 18: |> Seq.map (fun x -> Types x) 19: 20: let getType ( x : obj ) : Type = 21: let y = x.GetType() in y 22: 23: let getFields (x : obj) (flags : BindingFlags) = 24: let t = getType x in t.GetFields flags 25: |> Seq.map (fun x -> Fields x) 26: 27: let getProperties (x : obj) (flags : BindingFlags) = 28: let t = getType x in t.GetProperties flags 29: |> Seq.map (fun x -> Properties x) 30: 31: let getEvents (x : obj) (flags : BindingFlags) = 32: let t = getType x in t.GetEvents flags 33: |> Seq.map (fun x -> Events x) 34: 35: let getMethods (x : obj) (flags : BindingFlags) = 36: let t = getType x in t.GetMethods flags 37: |> Seq.map (fun x -> Methods x) 38: 39: let getConstructors (x : obj) (flags : BindingFlags) = 40: let t = getType x in t.GetConstructors flags 41: |> Seq.map (fun x -> Constructors x) 42: 43: let getMembers fflags pflags eflags mflags cflags (x : obj) = seq { 44: yield! getFields x fflags 45: yield! getProperties x pflags 46: yield! getEvents x eflags 47: yield! getMethods x mflags 48: yield! getConstructors x cflags } 49: 50: // I don't want to type these over and over again 51: let Static = 52: ( BindingFlags.Static 53: ||| BindingFlags.NonPublic 54: ||| BindingFlags.Public) 55: let Instance = 56: ( BindingFlags.Instance 57: ||| BindingFlags.NonPublic 58: ||| BindingFlags.Public) 59: let All = 60: ( BindingFlags.Static 61: ||| BindingFlags.Instance 62: ||| BindingFlags.NonPublic 63: ||| BindingFlags.Public) 64: 65: // A sequence of types from FSharp.Core.dll 66: let fscore = 67: Reflect.getTypes (@"C:\Program Files (x86)\FSharp-2.0.0.0\bin\FSharp.Core.dll") 68: 69: // Printing all members 70: fscore 71: |> Seq.map(fun x -> 72: match x with 73: | Reflect.Types x -> (Reflect.getMembers All All All All All x),(x.Name) 74: | _ -> failwith "wrong type") 75: |> Seq.iter (fun (x,y) -> 76: Seq.iter (fun x -> 77: match x with 78: | Reflect.Types x -> printfn "%s\tType: %s" y <| x.Name 79: | Reflect.Fields x -> printfn "%s\tField: %s" y <| x.Name 80: | Reflect.Properties x -> printfn "%s\tProperty: %s" y <| x.Name 81: | Reflect.Events x -> printfn "%s\tEvent: %s" y <| x.Name 82: | Reflect.Methods x -> printfn "%s\tMethod: %s" y <| x.Name 83: | Reflect.Constructors x -> printfn "%s\tConstructor: %s" y <| x.Name) x )That should keep your FSI busy for a moment while you read the rest of this post. It’s not a secret that there are quite a few types available to us in .NET and we get a handful or two more when we reference FSharp.Core.dll. A type is just data, and alone it is boring if not a bit useless. Here’s the interesting part though: In F#, functions are types. These function types are still data. To do something interesting, all we need is to give a function some data, and it gives us some new data in return. The data we give to our function can be an Object(s) and/or another function(s), as both are just data. F# is a functional programming language. When we say ‘functional’ we are talking about a Function (computer science) as much as we’re talking about a Function (mathematics). A function in F# straddles these two definitions quite nicely. No doubt you are familiar with the computer science definition of a Function / Method / Procedure / Subroutine. For this reason I want you to fearlessly broach the mathematical side of F# functions. Or, if you are mathematically inclined but haven’t used F# for mathematical programming… Have a look. Let’s take a short look at the “anatomy” of an F# function. Really, this isn’t going to be mathematically rigorous. I’m not a mathematician, I’m a programmer. I’m not patient enough to do any hand holding throughout, so I’m just going to show you (unless you already know) the names for things so when we bring them up in later posts (about Gang of Four OOP Design Patterns from the perspective of Functional Programing) we won’t have to stop and explain what they mean.
84: // Function 85: let sum a b = a + b // val add : int -> int -> int 86: let mul a b = a * b // val mul : int -> int -> int 87: let sqr n = mul n n // val sqr : int -> intA function relates each element of a “set” with exactly one element of another “set”, which could possibly be the same “set”. Maybe, as programmers, we can get away with saying “class”. I think you will also find that the term ‘relates’ is more useful in the long run over a word like ‘transforms’, at least until later on… There is a kind of notation we can use to reason about the type of a function in F#. It is called arrow notation. It is easy to read, and after a few exercises and expanding our vocabulary a little it becomes pretty easy to manipulate. To show this off I’m going to need a function that takes a lot of parameters. Are you familiar with the Drake equation? (a more informative and animated infographic is just as entertaining to watch)
88: // functions are actually curried 89: let drakeEq R fp ne fl fi fc L : float = 90: (float R) * fp * ne * fl * fi * fc * (float L)There are a lot of Objects and Arrows in this particular function’s signature. Good, because I want to show you what a curried function actually means. Place your mouse cursor over the function name drakeEq on line 89 and observe the signature: \(drakeEq : int \rightarrow float \rightarrow float \rightarrow float \rightarrow float \rightarrow int \rightarrow float\) This arrow notation may seem arcane to you, but it is necessary due to the fact that function parameters are implicitly curried. This signature corresponds with the lambda beginning at line 92 and ending at line 98. This arrow notation may seem arcane to you, but it is extremely helpful in F# due to the fact that function parameters are implicitly curried. You can use this feature of F# to construct higher order functions. You can pick-apart the parameters and wedge functions into them as long as the algebraic type signatures line up. Here’s how you read that signature: drakeEq is a function that takes an int and a float and a float and a float and a float and an int and returns a float. When reading function signatures, the last type to appear is the type being returned by the function. Any functions taking other functions as parameters will express that in their type signatures by surrounding the input function with parenthesis. For the drakeEq, though, here is what is (sort of) happening behind the scenes:
91: // like this: 92: (fun (R : int ) -> 93: (fun (fp : float) -> 94: (fun (ne : float) -> 95: (fun (fl : float) -> 96: (fun (fi : float) -> 97: (fun (fc : float) -> 98: (fun (L : int ) -> (float R) * fp * ne * fl * fi * fc * (float L))))))))Hmm… This looks like a bunch of nested lambda expressions. In fact, all but the outer-most of these anonymous functions is wrapped by an outer lambda. This has the same recursive structure as a Linked List does, with the exception that the input values to each one of the lambdas have closure in the nested lambdas.
99: // recursive data type 100: type 'a LinkedList = 101: | Empty // aka: nil 102: | Element of 'a * 'a LinkedList // aka: cons 103: // aka: car // aka: cdrRemember that functions are data too, so this means we can recursively deconstruct functions, or recursively construct them and hand them out to be evaluated later, as we do in Continuation Passing Style. We could specify the drakeEq like so:
104: let drakeEq' (R,fp,ne,fl,fi,fc,L) : float = 105: (float R) * fp * ne * fl * fi * fc * (float L)This changes the signature to: \(drakeEq' : int * float * float * float * float * float * int \rightarrow float \) And we lose the ability to curry the function on each of the inputs. Because the notation (value1,value2) represents a tuple in F# and a tuple is essentially just one composite value. So, the real power behind currying can be harnessed in this way, as well as; Higher Order Functions (HoF), Partial Application, and continuation passing style, for example. Let’s take a look at each one of those concepts.
106: let xs = Element(1, Element(2, Element(3,Empty))) 107: // these signatures compose 108: [1..9] // int list is usable as an seq<'a> 109: ( |> ) // ('a -> ('a -> 'b) -> 'b) 110: (Seq.filter) // (('a -> bool) -> seq<'a> -> seq<'a>) 111: (fun x -> x % 3 = 0) // (int -> bool) 112: 113: // into this higher order function 114: [1..9] |> Seq.filter (fun x -> x % 3 = 0)The type ‘a is special and stands for a generic type. The type ‘b stands for a generic type that isn’t necessarily the same type as ‘a. The evaluation order for line 114 considers ( |> ) first. The job of ( |> ) is to put the expression on the left into the expression on the right. When the type is evaluated it is inferred to be the type int. So our ‘a here is really standing for int now. The next part that is evaluated is the lambda. Easy to see that its type is (int -> bool) and since ‘a stands for int, it fits nicely into the first parameter of Seq.filter. Seq.filter enumerates our list applying the lambda to each element and returns to us a seq<int> containing the elements [3;6;9]. The compiled representation of an F# function is an instance of the Microsoft.FSharp.FastFunc class. F# functions are not delegates.
116: // partial application 117: let next = sum 1 // val next : int -> int 118: let twice = mul 2 // val twice : int -> int 119: let x = let n = 4 in twice <| sqr n + next n // val it : int = 42F# programmers love composability, though these trivial examples do little to expose the great usefulness of these features. To make the most of these features, as you gain experience, you need to become comfortable with the functional arrow notation. Look, you don’t have to be good at math to make use of it, you really only need to know the rules for moving symbols around.
121: // an example of continuation passing style using a (foldBack) catamorphism 122: let foldr f acc xs = 123: let rec foldr xs k = 124: match xs with 125: | Element(x,xs) -> foldr xs (fun racc -> k (f x racc)) 126: | Empty -> k acc 127: foldr xs id 128: 129: // the opposite of foldr (no continuation passing is necessary) 130: let rec foldl f acc xs = 131: match xs with 132: | Element(x,xs) -> foldl f (f acc x) xs 133: | Empty -> acc 134: 135: // some higher order functions implemented in terms of folds 136: let identity xs = foldr (fun x xs -> Element(x,xs)) (Empty) xs 137: let reverse xs = foldl (fun xs x -> Element(x,xs)) (Empty) xs 138: let length xs = foldl (fun xs _ -> 1 + xs) 0 xs 139: let summation xs = foldl (fun xs x -> x + xs) 0 xs 140: let product xs = foldl (fun xs x -> x * xs) 1 xsFolding is pretty useful and goes a long way to creating elegant and composable programs. You can also call folding a “catamorphism”. Folding is easier to say, but catamorphism is a lot more meaningful, and more general. By the way, the dual of any theorem is also a theorem. If you’ve been using the intellisense on the code to view the signatures of these functions you will notice that a cataomorphism on our LinkedList type is: \(LinkedList<'a> \rightarrow ‘b\) To “dualize” this we simply turn the arrow around. \(‘a \rightarrow LinkedList<'b>\) Here, we don’t have to worry about the discrepancy between the positions of ‘a and ‘b. They’re equally generic. Intellisense will typically report them in alphabetical order.
142: // the dual of folding, unfolding 143: let rec unfold unspool finished x = 144: match x with 145: | x when finished x -> Empty 146: | _ -> let a,y = unspool x in Element(a,unfold unspool finished y) 147: 148: let fibUntil until = 149: unfold (fun x -> let b' = (fst x + snd x) in (b',(snd x, b'))) 150: (fun x -> snd x >= until ) 151: (0,1) 152: 153: fibUntil 34 154: 155: let fibs (x : int) = 156: let x = ref x in 157: unfold ( fun x -> let b' = (fst x + snd x) in (b',(snd x, b'))) 158: ((fun x _ -> if !x = 0 then true 159: else x := !x - 1; false ) <| x) 160: (0,1) 161: 162: fibs 10Unfolding is also useful and goes just as far toward creating elegant and composable programs. You can also call unfolding an “anamorphism”. However, I should let you know that my sloppy blog solutions are no match for what F# provides out of the box. I just wanted an anamorphism over our LinkedList type we defined above. LinkedList already comes with F# as List and a lazy version, LazyList, is available in PowerPack. When unfolding though, we don’t know when we’re going to stop so it is definitely better to use a lazy data structure. F# gives us the Seq module that works with any IEnumerable:
164: // best to use whats already in the framework 165: let fibonacci = Seq.unfold (fun (x, y) -> Some(x, (y, x + y))) (0I,1I) 166: fibonacci |> Seq.nth 10000Mathematicians don’t like a lot of cruft in their notation, especially when simple symbols will do the trick. A function is like a machine that relates an input to an output. Another way of looking at a function is a sort of dictionary. Where the input is the key, and the output is the value. In fact, I really like that way of looking at things. You cannot have the same key mapping to different values. Neither may a function relate its input to different values (unless these values have been tuple’d into one value!). Notice the similarity here between the F# function signatures: Signature:
\(f : {N} \rightarrow {N}\)
Implementation:
\(f : x \mapsto x^2\) Functions usually have a name, but like F# you don’t have to necessarily give them one: \(x = n^2\). There is still an input n and an output y and the relation of squaring. \(f(x) = x^2\) We read this as “f of x equals x squared”. Of course x is definately numerical in nature, so in F# it would be like: let inline f (x : ^x) = x * x. A bit more wordy, but computers aren’t as smart as mathematicians so we have to clue them in that ^x here needs to be statically resolved. Functions have formal rules. It must work every time for every possible input value. It must give the same result for the same input value every time. You can only have one relation for each input value. One-to-many relations are not O.K., but many-to-one relations are just fine. If a relationship doesn’t follow these rules, then it is not a function. These rules are very important in the long run for making educated assumptions regarding the interaction, or rather, the composition of functions in a complex system. The Domain of a function is it’s spectrum of input. The Codomain is its spectrum of output. The Range of a function is some subset of the codomain, for which the domain relates. A Relationship is the operation performed on the domain to give us a value in the codomain. For instance, using the relation \(x^2\) in the domain of Integers (\({Z}\) then we know that \(f : {Z} \rightarrow {Z}\) is the signature of our function. The \(\mapsto\) in \(f : x \mapsto x^2\) is called “maps to” and maps an integer to another integer. Or, if you prefer to imagine it as a table lookup, it “looks up” an integer value using an integer key. Though the domain and codomain are the same sets, the range of our relation \(x^2\) is a subset of \({Z}\). You do the math on that one. Functions can come in pieces, called piecewise functions. F# can do piecewise functions using pattern matching syntax. Have a look at the foldr and foldl implementations again. Sometimes you’re matching on the quality of a type instead of a type itself… in that case pattern matching accompanied by Active Patterns will give you the same semantics as piecewise functions in mathematics.
BONUS:
I can imagine a situation where we would want to take from the domain of our Drake equation the most educated guesses we have available to restrict the range to some known quantity. For instance we know for certain there is 1 civilization in our galaxy capable of radio astronomy. Maybe there is more than one educated guess for each of the drake equation’s parameters. There’s really no use in bickering about which one is the better one… after all they’re both estimates and outright guesses, right? We do have a pretty good guess for R, and we can say that N is definately equal to 1. What could the others be? Enter: Solver Foundation.167: #I "lib" 168: #r "Microsoft.Solver.Foundation.dll" 169: open Microsoft.SolverFoundation.Common 170: open Microsoft.SolverFoundation.Solvers 171: open Microsoft.SolverFoundation.Services 172: 173: // This wrapper comes with Solver Foundation in the F# Samples 174: #load "SfsWrapper.fsx" 175: open SfsWrapper 176: 177: // these measure types aren't necessary for this example but were 178: // used to make it easier to keep track of what the variables in the 179: // drake equation stand for. 180: [<Measure>] type Year 181: [<Measure>] type Star 182: [<Measure>] type Planet 183: [<Measure>] type LifeCapible = Planet / Planet / Star 184: [<Measure>] type Life = Planet / LifeCapible 185: [<Measure>] type IntelligentLife = Planet / Life 186: [<Measure>] type CommunicatingIntelligentLife = Planet / IntelligentLife 187: [<Measure>] type Civilization 188: 189: let context = SolverContext.GetContext() 190: let drake = SfsModel(context) 191: 192: // optimization variables 193: let R = drake.CreateRealVariable<Star/Year>() 194: let fp = drake.CreateRealVariable<Planet/Star>() 195: let ne = drake.CreateRealVariable<LifeCapible>() 196: let fl = drake.CreateRealVariable<Life>() 197: let fi = drake.CreateRealVariable<IntelligentLife>() 198: let fc = drake.CreateRealVariable<CommunicatingIntelligentLife>() 199: let L = drake.CreateRealVariable<Year>() 200: let N = drake.CreateRealVariable<CommunicatingIntelligentLife 201: IntelligentLife Life 202: LifeCapible Planet>() 203: 204: // none of these should dip below 0.0 205: drake.AddConstraints [| 206: 0.0<_> <<== R; 0.0<_> <<== fp; 0.0<_> <<== ne; 0.0<_> <<== fl; 207: 0.0<_> <<== fi; 0.0<_> <<== fc; 0.0<_> <<== L; 1.0<_> ==== N 208: |] 209: 210: let cR = drake.AddConstraint ( R ==== 7.0<_> ) 211: let cfp = drake.AddConstraint ( fp <<== 8.0<_> ) 212: let cne = drake.AddConstraint ( ne <<== 1.0<_> ) 213: let cfl = drake.AddConstraint ( fl <<== 1.0<_> ) 214: let cfi = drake.AddConstraint ( fi <<== 1.0<_> ) 215: let cfc = drake.AddConstraint ( fc <<== 1.0<_> ) 216: let cL = drake.AddConstraint ( L <<== 304.0<_> ) 217: let cN = drake.AddConstraint ( N ==== R * fp * ne * fl * fi * fc * L ) 218: 219: let minimumLifeCapible = drake.AddGoal( GoalKind.Minimize, 220: R * fp * ne * fl * fi * fc * L ) 221: 222: //drake.RemoveGoal(minimumLifeCapible) 223: let solution = drake.Solve(LocalSearch) 224: 225: // see the results 226: // val it : SolverQuality = LocalOptimal 227: solution.Quality 228: // val it : R = 7.0 229: R.Value |> float 230: // val it : fp = 4.341172079 231: fp.Value |> float 232: // val it : ne = 0.06266237088 233: ne.Value |> float 234: // val it : fl = 0.0303299242 235: fl.Value |> float 236: // val it : fi = 0.1318182999 237: fi.Value |> float 238: // val it : fc = 0.7418663017 239: fc.Value |> float 240: // val it : L = 177.0579602 241: L.Value |> float 242: // val it : N = 0.99999999 243: N.Value |> floatF# Web Snippets
namespace System
namespace System.IO
namespace System.Reflection
type Info =
| Types of Type
| Fields of FieldInfo
| Properties of PropertyInfo
| Events of EventInfo
| Methods of MethodInfo
| Constructors of ConstructorInfo
Full name: Arrow-Notation-via-FSharp.Reflect.Info
type: Info
implements: IEquatable<Info>
implements: Collections.IStructuralEquatable
union case Info.Types: Type -> Info
type Type =
class
inherit System.Reflection.MemberInfo
member Assembly : System.Reflection.Assembly
member AssemblyQualifiedName : string
member Attributes : System.Reflection.TypeAttributes
member BaseType : System.Type
member ContainsGenericParameters : bool
member DeclaringMethod : System.Reflection.MethodBase
member DeclaringType : System.Type
member Equals : obj -> bool
member Equals : System.Type -> bool
member FindInterfaces : System.Reflection.TypeFilter * obj -> System.Type []
member FindMembers : System.Reflection.MemberTypes * System.Reflection.BindingFlags * System.Reflection.MemberFilter * obj -> System.Reflection.MemberInfo []
member FullName : string
member GUID : System.Guid
member GenericParameterAttributes : System.Reflection.GenericParameterAttributes
member GenericParameterPosition : int
member GetArrayRank : unit -> int
member GetConstructor : System.Type [] -> System.Reflection.ConstructorInfo
member GetConstructor : System.Reflection.BindingFlags * System.Reflection.Binder * System.Type [] * System.Reflection.ParameterModifier [] -> System.Reflection.ConstructorInfo
member GetConstructor : System.Reflection.BindingFlags * System.Reflection.Binder * System.Reflection.CallingConventions * System.Type [] * System.Reflection.ParameterModifier [] -> System.Reflection.ConstructorInfo
member GetConstructors : unit -> System.Reflection.ConstructorInfo []
member GetConstructors : System.Reflection.BindingFlags -> System.Reflection.ConstructorInfo []
member GetDefaultMembers : unit -> System.Reflection.MemberInfo []
member GetElementType : unit -> System.Type
member GetEnumName : obj -> string
member GetEnumNames : unit -> string []
member GetEnumUnderlyingType : unit -> System.Type
member GetEnumValues : unit -> System.Array
member GetEvent : string -> System.Reflection.EventInfo
member GetEvent : string * System.Reflection.BindingFlags -> System.Reflection.EventInfo
member GetEvents : unit -> System.Reflection.EventInfo []
member GetEvents : System.Reflection.BindingFlags -> System.Reflection.EventInfo []
member GetField : string -> System.Reflection.FieldInfo
member GetField : string * System.Reflection.BindingFlags -> System.Reflection.FieldInfo
member GetFields : unit -> System.Reflection.FieldInfo []
member GetFields : System.Reflection.BindingFlags -> System.Reflection.FieldInfo []
member GetGenericArguments : unit -> System.Type []
member GetGenericParameterConstraints : unit -> System.Type []
member GetGenericTypeDefinition : unit -> System.Type
member GetHashCode : unit -> int
member GetInterface : string -> System.Type
member GetInterface : string * bool -> System.Type
member GetInterfaceMap : System.Type -> System.Reflection.InterfaceMapping
member GetInterfaces : unit -> System.Type []
member GetMember : string -> System.Reflection.MemberInfo []
member GetMember : string * System.Reflection.BindingFlags -> System.Reflection.MemberInfo []
member GetMember : string * System.Reflection.MemberTypes * System.Reflection.BindingFlags -> System.Reflection.MemberInfo []
member GetMembers : unit -> System.Reflection.MemberInfo []
member GetMembers : System.Reflection.BindingFlags -> System.Reflection.MemberInfo []
member GetMethod : string -> System.Reflection.MethodInfo
member GetMethod : string * System.Type [] -> System.Reflection.MethodInfo
member GetMethod : string * System.Reflection.BindingFlags -> System.Reflection.MethodInfo
member GetMethod : string * System.Type [] * System.Reflection.ParameterModifier [] -> System.Reflection.MethodInfo
member GetMethod : string * System.Reflection.BindingFlags * System.Reflection.Binder * System.Type [] * System.Reflection.ParameterModifier [] -> System.Reflection.MethodInfo
member GetMethod : string * System.Reflection.BindingFlags * System.Reflection.Binder * System.Reflection.CallingConventions * System.Type [] * System.Reflection.ParameterModifier [] -> System.Reflection.MethodInfo
member GetMethods : unit -> System.Reflection.MethodInfo []
member GetMethods : System.Reflection.BindingFlags -> System.Reflection.MethodInfo []
member GetNestedType : string -> System.Type
member GetNestedType : string * System.Reflection.BindingFlags -> System.Type
member GetNestedTypes : unit -> System.Type []
member GetNestedTypes : System.Reflection.BindingFlags -> System.Type []
member GetProperties : unit -> System.Reflection.PropertyInfo []
member GetProperties : System.Reflection.BindingFlags -> System.Reflection.PropertyInfo []
member GetProperty : string -> System.Reflection.PropertyInfo
member GetProperty : string * System.Reflection.BindingFlags -> System.Reflection.PropertyInfo
member GetProperty : string * System.Type [] -> System.Reflection.PropertyInfo
member GetProperty : string * System.Type -> System.Reflection.PropertyInfo
member GetProperty : string * System.Type * System.Type [] -> System.Reflection.PropertyInfo
member GetProperty : string * System.Type * System.Type [] * System.Reflection.ParameterModifier [] -> System.Reflection.PropertyInfo
member GetProperty : string * System.Reflection.BindingFlags * System.Reflection.Binder * System.Type * System.Type [] * System.Reflection.ParameterModifier [] -> System.Reflection.PropertyInfo
member GetType : unit -> System.Type
member HasElementType : bool
member InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj [] -> obj
member InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj [] * System.Globalization.CultureInfo -> obj
member InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj [] * System.Reflection.ParameterModifier [] * System.Globalization.CultureInfo * string [] -> obj
member IsAbstract : bool
member IsAnsiClass : bool
member IsArray : bool
member IsAssignableFrom : System.Type -> bool
member IsAutoClass : bool
member IsAutoLayout : bool
member IsByRef : bool
member IsCOMObject : bool
member IsClass : bool
member IsContextful : bool
member IsEnum : bool
member IsEnumDefined : obj -> bool
member IsEquivalentTo : System.Type -> bool
member IsExplicitLayout : bool
member IsGenericParameter : bool
member IsGenericType : bool
member IsGenericTypeDefinition : bool
member IsImport : bool
member IsInstanceOfType : obj -> bool
member IsInterface : bool
member IsLayoutSequential : bool
member IsMarshalByRef : bool
member IsNested : bool
member IsNestedAssembly : bool
member IsNestedFamANDAssem : bool
member IsNestedFamORAssem : bool
member IsNestedFamily : bool
member IsNestedPrivate : bool
member IsNestedPublic : bool
member IsNotPublic : bool
member IsPointer : bool
member IsPrimitive : bool
member IsPublic : bool
member IsSealed : bool
member IsSecurityCritical : bool
member IsSecuritySafeCritical : bool
member IsSecurityTransparent : bool
member IsSerializable : bool
member IsSpecialName : bool
member IsSubclassOf : System.Type -> bool
member IsUnicodeClass : bool
member IsValueType : bool
member IsVisible : bool
member MakeArrayType : unit -> System.Type
member MakeArrayType : int -> System.Type
member MakeByRefType : unit -> System.Type
member MakeGenericType : System.Type [] -> System.Type
member MakePointerType : unit -> System.Type
member MemberType : System.Reflection.MemberTypes
member Module : System.Reflection.Module
member Namespace : string
member ReflectedType : System.Type
member StructLayoutAttribute : System.Runtime.InteropServices.StructLayoutAttribute
member ToString : unit -> string
member TypeHandle : System.RuntimeTypeHandle
member TypeInitializer : System.Reflection.ConstructorInfo
member UnderlyingSystemType : System.Type
static val FilterAttribute : System.Reflection.MemberFilter
static val FilterName : System.Reflection.MemberFilter
static val FilterNameIgnoreCase : System.Reflection.MemberFilter
static val Missing : obj
static val Delimiter : char
static val EmptyTypes : System.Type []
static member DefaultBinder : System.Reflection.Binder
static member GetType : string -> System.Type
static member GetType : string * bool -> System.Type
static member GetType : string * bool * bool -> System.Type
static member GetType : string * System.Func<System.Reflection.AssemblyName,System.Reflection.Assembly> * System.Func<System.Reflection.Assembly,string,bool,System.Type> -> System.Type
static member GetType : string * System.Func<System.Reflection.AssemblyName,System.Reflection.Assembly> * System.Func<System.Reflection.Assembly,string,bool,System.Type> * bool -> System.Type
static member GetType : string * System.Func<System.Reflection.AssemblyName,System.Reflection.Assembly> * System.Func<System.Reflection.Assembly,string,bool,System.Type> * bool * bool -> System.Type
static member GetTypeArray : obj [] -> System.Type []
static member GetTypeCode : System.Type -> System.TypeCode
static member GetTypeFromCLSID : System.Guid -> System.Type
static member GetTypeFromCLSID : System.Guid * bool -> System.Type
static member GetTypeFromCLSID : System.Guid * string -> System.Type
static member GetTypeFromCLSID : System.Guid * string * bool -> System.Type
static member GetTypeFromHandle : System.RuntimeTypeHandle -> System.Type
static member GetTypeFromProgID : string -> System.Type
static member GetTypeFromProgID : string * bool -> System.Type
static member GetTypeFromProgID : string * string -> System.Type
static member GetTypeFromProgID : string * string * bool -> System.Type
static member GetTypeHandle : obj -> System.RuntimeTypeHandle
static member ReflectionOnlyGetType : string * bool * bool -> System.Type
end
Full name: System.Type
type: Type
implements: ICustomAttributeProvider
implements: Runtime.InteropServices._MemberInfo
implements: Runtime.InteropServices._Type
implements: IReflect
inherits: MemberInfo
union case Info.Fields: FieldInfo -> Info
type FieldInfo =
class
inherit System.Reflection.MemberInfo
member Attributes : System.Reflection.FieldAttributes
member Equals : obj -> bool
member FieldHandle : System.RuntimeFieldHandle
member FieldType : System.Type
member GetHashCode : unit -> int
member GetOptionalCustomModifiers : unit -> System.Type []
member GetRawConstantValue : unit -> obj
member GetRequiredCustomModifiers : unit -> System.Type []
member GetValue : obj -> obj
member GetValueDirect : System.TypedReference -> obj
member IsAssembly : bool
member IsFamily : bool
member IsFamilyAndAssembly : bool
member IsFamilyOrAssembly : bool
member IsInitOnly : bool
member IsLiteral : bool
member IsNotSerialized : bool
member IsPinvokeImpl : bool
member IsPrivate : bool
member IsPublic : bool
member IsSecurityCritical : bool
member IsSecuritySafeCritical : bool
member IsSecurityTransparent : bool
member IsSpecialName : bool
member IsStatic : bool
member MemberType : System.Reflection.MemberTypes
member SetValue : obj * obj -> unit
member SetValue : obj * obj * System.Reflection.BindingFlags * System.Reflection.Binder * System.Globalization.CultureInfo -> unit
member SetValueDirect : System.TypedReference * obj -> unit
static member GetFieldFromHandle : System.RuntimeFieldHandle -> System.Reflection.FieldInfo
static member GetFieldFromHandle : System.RuntimeFieldHandle * System.RuntimeTypeHandle -> System.Reflection.FieldInfo
end
Full name: System.Reflection.FieldInfo
type: FieldInfo
implements: ICustomAttributeProvider
implements: Runtime.InteropServices._MemberInfo
implements: Runtime.InteropServices._FieldInfo
inherits: MemberInfo
union case Info.Properties: PropertyInfo -> Info
type PropertyInfo =
class
inherit System.Reflection.MemberInfo
member Attributes : System.Reflection.PropertyAttributes
member CanRead : bool
member CanWrite : bool
member Equals : obj -> bool
member GetAccessors : unit -> System.Reflection.MethodInfo []
member GetAccessors : bool -> System.Reflection.MethodInfo []
member GetConstantValue : unit -> obj
member GetGetMethod : unit -> System.Reflection.MethodInfo
member GetGetMethod : bool -> System.Reflection.MethodInfo
member GetHashCode : unit -> int
member GetIndexParameters : unit -> System.Reflection.ParameterInfo []
member GetOptionalCustomModifiers : unit -> System.Type []
member GetRawConstantValue : unit -> obj
member GetRequiredCustomModifiers : unit -> System.Type []
member GetSetMethod : unit -> System.Reflection.MethodInfo
member GetSetMethod : bool -> System.Reflection.MethodInfo
member GetValue : obj * obj [] -> obj
member GetValue : obj * System.Reflection.BindingFlags * System.Reflection.Binder * obj [] * System.Globalization.CultureInfo -> obj
member IsSpecialName : bool
member MemberType : System.Reflection.MemberTypes
member PropertyType : System.Type
member SetValue : obj * obj * obj [] -> unit
member SetValue : obj * obj * System.Reflection.BindingFlags * System.Reflection.Binder * obj [] * System.Globalization.CultureInfo -> unit
end
Full name: System.Reflection.PropertyInfo
type: PropertyInfo
implements: ICustomAttributeProvider
implements: Runtime.InteropServices._MemberInfo
implements: Runtime.InteropServices._PropertyInfo
inherits: MemberInfo
union case Info.Events: EventInfo -> Info
type EventInfo =
class
inherit System.Reflection.MemberInfo
member AddEventHandler : obj * System.Delegate -> unit
member Attributes : System.Reflection.EventAttributes
member Equals : obj -> bool
member EventHandlerType : System.Type
member GetAddMethod : unit -> System.Reflection.MethodInfo
member GetAddMethod : bool -> System.Reflection.MethodInfo
member GetHashCode : unit -> int
member GetOtherMethods : unit -> System.Reflection.MethodInfo []
member GetOtherMethods : bool -> System.Reflection.MethodInfo []
member GetRaiseMethod : unit -> System.Reflection.MethodInfo
member GetRaiseMethod : bool -> System.Reflection.MethodInfo
member GetRemoveMethod : unit -> System.Reflection.MethodInfo
member GetRemoveMethod : bool -> System.Reflection.MethodInfo
member IsMulticast : bool
member IsSpecialName : bool
member MemberType : System.Reflection.MemberTypes
member RemoveEventHandler : obj * System.Delegate -> unit
end
Full name: System.Reflection.EventInfo
type: EventInfo
implements: ICustomAttributeProvider
implements: Runtime.InteropServices._MemberInfo
implements: Runtime.InteropServices._EventInfo
inherits: MemberInfo
union case Info.Methods: MethodInfo -> Info
type MethodInfo =
class
inherit System.Reflection.MethodBase
member Equals : obj -> bool
member GetBaseDefinition : unit -> System.Reflection.MethodInfo
member GetGenericArguments : unit -> System.Type []
member GetGenericMethodDefinition : unit -> System.Reflection.MethodInfo
member GetHashCode : unit -> int
member MakeGenericMethod : System.Type [] -> System.Reflection.MethodInfo
member MemberType : System.Reflection.MemberTypes
member ReturnParameter : System.Reflection.ParameterInfo
member ReturnType : System.Type
member ReturnTypeCustomAttributes : System.Reflection.ICustomAttributeProvider
end
Full name: System.Reflection.MethodInfo
type: MethodInfo
implements: ICustomAttributeProvider
implements: Runtime.InteropServices._MemberInfo
implements: Runtime.InteropServices._MethodBase
implements: Runtime.InteropServices._MethodInfo
inherits: MethodBase
inherits: MemberInfo
union case Info.Constructors: ConstructorInfo -> Info
type ConstructorInfo =
class
inherit System.Reflection.MethodBase
member Equals : obj -> bool
member GetHashCode : unit -> int
member Invoke : obj [] -> obj
member Invoke : System.Reflection.BindingFlags * System.Reflection.Binder * obj [] * System.Globalization.CultureInfo -> obj
member MemberType : System.Reflection.MemberTypes
static val ConstructorName : string
static val TypeConstructorName : string
end
Full name: System.Reflection.ConstructorInfo
type: ConstructorInfo
implements: ICustomAttributeProvider
implements: Runtime.InteropServices._MemberInfo
implements: Runtime.InteropServices._MethodBase
implements: Runtime.InteropServices._ConstructorInfo
inherits: MethodBase
inherits: MemberInfo
val getTypes : string -> seq<Info>
Full name: Arrow-Notation-via-FSharp.Reflect.getTypes
val x : string
type: string
implements: IComparable
implements: ICloneable
implements: IConvertible
implements: IComparable<string>
implements: seq<char>
implements: Collections.IEnumerable
implements: IEquatable<string>
Multiple items
val string : 'T -> string
Full name: Microsoft.FSharp.Core.Operators.string
--------------------
type string = String
Full name: Microsoft.FSharp.Core.string
type: string
implements: IComparable
implements: ICloneable
implements: IConvertible
implements: IComparable<string>
implements: seq<char>
implements: Collections.IEnumerable
implements: IEquatable<string>
val asm : Assembly
type: Assembly
implements: Runtime.InteropServices._Assembly
implements: Security.IEvidenceFactory
implements: ICustomAttributeProvider
implements: Runtime.Serialization.ISerializable
type Assembly =
class
member CodeBase : string
member CreateInstance : string -> obj
member CreateInstance : string * bool -> obj
member CreateInstance : string * bool * System.Reflection.BindingFlags * System.Reflection.Binder * obj [] * System.Globalization.CultureInfo * obj [] -> obj
member EntryPoint : System.Reflection.MethodInfo
member Equals : obj -> bool
member EscapedCodeBase : string
member Evidence : System.Security.Policy.Evidence
member FullName : string
member GetCustomAttributes : bool -> obj []
member GetCustomAttributes : System.Type * bool -> obj []
member GetCustomAttributesData : unit -> System.Collections.Generic.IList<System.Reflection.CustomAttributeData>
member GetExportedTypes : unit -> System.Type []
member GetFile : string -> System.IO.FileStream
member GetFiles : unit -> System.IO.FileStream []
member GetFiles : bool -> System.IO.FileStream []
member GetHashCode : unit -> int
member GetLoadedModules : unit -> System.Reflection.Module []
member GetLoadedModules : bool -> System.Reflection.Module []
member GetManifestResourceInfo : string -> System.Reflection.ManifestResourceInfo
member GetManifestResourceNames : unit -> string []
member GetManifestResourceStream : string -> System.IO.Stream
member GetManifestResourceStream : System.Type * string -> System.IO.Stream
member GetModule : string -> System.Reflection.Module
member GetModules : unit -> System.Reflection.Module []
member GetModules : bool -> System.Reflection.Module []
member GetName : unit -> System.Reflection.AssemblyName
member GetName : bool -> System.Reflection.AssemblyName
member GetObjectData : System.Runtime.Serialization.SerializationInfo * System.Runtime.Serialization.StreamingContext -> unit
member GetReferencedAssemblies : unit -> System.Reflection.AssemblyName []
member GetSatelliteAssembly : System.Globalization.CultureInfo -> System.Reflection.Assembly
member GetSatelliteAssembly : System.Globalization.CultureInfo * System.Version -> System.Reflection.Assembly
member GetType : string -> System.Type
member GetType : string * bool -> System.Type
member GetType : string * bool * bool -> System.Type
member GetTypes : unit -> System.Type []
member GlobalAssemblyCache : bool
member HostContext : int64
member ImageRuntimeVersion : string
member IsDefined : System.Type * bool -> bool
member IsDynamic : bool
member IsFullyTrusted : bool
member LoadModule : string * System.Byte [] -> System.Reflection.Module
member LoadModule : string * System.Byte [] * System.Byte [] -> System.Reflection.Module
member Location : string
member ManifestModule : System.Reflection.Module
member PermissionSet : System.Security.PermissionSet
member ReflectionOnly : bool
member SecurityRuleSet : System.Security.SecurityRuleSet
member ToString : unit -> string
static member CreateQualifiedName : string * string -> string
static member GetAssembly : System.Type -> System.Reflection.Assembly
static member GetCallingAssembly : unit -> System.Reflection.Assembly
static member GetEntryAssembly : unit -> System.Reflection.Assembly
static member GetExecutingAssembly : unit -> System.Reflection.Assembly
static member Load : string -> System.Reflection.Assembly
static member Load : System.Reflection.AssemblyName -> System.Reflection.Assembly
static member Load : System.Byte [] -> System.Reflection.Assembly
static member Load : string * System.Security.Policy.Evidence -> System.Reflection.Assembly
static member Load : System.Reflection.AssemblyName * System.Security.Policy.Evidence -> System.Reflection.Assembly
static member Load : System.Byte [] * System.Byte [] -> System.Reflection.Assembly
static member Load : System.Byte [] * System.Byte [] * System.Security.SecurityContextSource -> System.Reflection.Assembly
static member Load : System.Byte [] * System.Byte [] * System.Security.Policy.Evidence -> System.Reflection.Assembly
static member LoadFile : string -> System.Reflection.Assembly
static member LoadFile : string * System.Security.Policy.Evidence -> System.Reflection.Assembly
static member LoadFrom : string -> System.Reflection.Assembly
static member LoadFrom : string * System.Security.Policy.Evidence -> System.Reflection.Assembly
static member LoadFrom : string * System.Byte [] * System.Configuration.Assemblies.AssemblyHashAlgorithm -> System.Reflection.Assembly
static member LoadFrom : string * System.Security.Policy.Evidence * System.Byte [] * System.Configuration.Assemblies.AssemblyHashAlgorithm -> System.Reflection.Assembly
static member LoadWithPartialName : string -> System.Reflection.Assembly
static member LoadWithPartialName : string * System.Security.Policy.Evidence -> System.Reflection.Assembly
static member ReflectionOnlyLoad : string -> System.Reflection.Assembly
static member ReflectionOnlyLoad : System.Byte [] -> System.Reflection.Assembly
static member ReflectionOnlyLoadFrom : string -> System.Reflection.Assembly
static member UnsafeLoadFrom : string -> System.Reflection.Assembly
end
Full name: System.Reflection.Assembly
type: Assembly
implements: Runtime.InteropServices._Assembly
implements: Security.IEvidenceFactory
implements: ICustomAttributeProvider
implements: Runtime.Serialization.ISerializable
Multiple overloads
Assembly.LoadFrom(assemblyFile: string) : Assembly
Assembly.LoadFrom(assemblyFile: string, hashValue: byte [], hashAlgorithm: Configuration.Assemblies.AssemblyHashAlgorithm) : Assembly
Assembly.GetTypes() : Type []
module Seq
from Microsoft.FSharp.Collections
val map : ('T -> 'U) -> seq<'T> -> seq<'U>
Full name: Microsoft.FSharp.Collections.Seq.map
val x : Type
type: Type
implements: ICustomAttributeProvider
implements: Runtime.InteropServices._MemberInfo
implements: Runtime.InteropServices._Type
implements: IReflect
inherits: MemberInfo
val getType : obj -> Type
Full name: Arrow-Notation-via-FSharp.Reflect.getType
val x : obj
type obj = Object
Full name: Microsoft.FSharp.Core.obj
val y : Type
type: Type
implements: ICustomAttributeProvider
implements: Runtime.InteropServices._MemberInfo
implements: Runtime.InteropServices._Type
implements: IReflect
inherits: MemberInfo
Object.GetType() : Type
val getFields : obj -> BindingFlags -> seq<Info>
Full name: Arrow-Notation-via-FSharp.Reflect.getFields
val flags : BindingFlags
type: BindingFlags
inherits: Enum
inherits: ValueType
type BindingFlags =
| Default = 0
| IgnoreCase = 1
| DeclaredOnly = 2
| Instance = 4
| Static = 8
| Public = 16
| NonPublic = 32
| FlattenHierarchy = 64
| InvokeMethod = 256
| CreateInstance = 512
| GetField = 1024
| SetField = 2048
| GetProperty = 4096
| SetProperty = 8192
| PutDispProperty = 16384
| PutRefDispProperty = 32768
| ExactBinding = 65536
| SuppressChangeType = 131072
| OptionalParamBinding = 262144
| IgnoreReturn = 16777216
Full name: System.Reflection.BindingFlags
type: BindingFlags
inherits: Enum
inherits: ValueType
val t : Type
type: Type
implements: ICustomAttributeProvider
implements: Runtime.InteropServices._MemberInfo
implements: Runtime.InteropServices._Type
implements: IReflect
inherits: MemberInfo
Multiple overloads
Type.GetFields() : FieldInfo []
Type.GetFields(bindingAttr: BindingFlags) : FieldInfo []
val x : FieldInfo
type: FieldInfo
implements: ICustomAttributeProvider
implements: Runtime.InteropServices._MemberInfo
implements: Runtime.InteropServices._FieldInfo
inherits: MemberInfo
val getProperties : obj -> BindingFlags -> seq<Info>
Full name: Arrow-Notation-via-FSharp.Reflect.getProperties
Multiple overloads
Type.GetProperties() : PropertyInfo []
Type.GetProperties(bindingAttr: BindingFlags) : PropertyInfo []
val x : PropertyInfo
type: PropertyInfo
implements: ICustomAttributeProvider
implements: Runtime.InteropServices._MemberInfo
implements: Runtime.InteropServices._PropertyInfo
inherits: MemberInfo
val getEvents : obj -> BindingFlags -> seq<Info>
Full name: Arrow-Notation-via-FSharp.Reflect.getEvents
Multiple overloads
Type.GetEvents() : EventInfo []
Type.GetEvents(bindingAttr: BindingFlags) : EventInfo []
val x : EventInfo
type: EventInfo
implements: ICustomAttributeProvider
implements: Runtime.InteropServices._MemberInfo
implements: Runtime.InteropServices._EventInfo
inherits: MemberInfo
val getMethods : obj -> BindingFlags -> seq<Info>
Full name: Arrow-Notation-via-FSharp.Reflect.getMethods
Multiple overloads
Type.GetMethods() : MethodInfo []
Type.GetMethods(bindingAttr: BindingFlags) : MethodInfo []
val x : MethodInfo
type: MethodInfo
implements: ICustomAttributeProvider
implements: Runtime.InteropServices._MemberInfo
implements: Runtime.InteropServices._MethodBase
implements: Runtime.InteropServices._MethodInfo
inherits: MethodBase
inherits: MemberInfo
val getConstructors : obj -> BindingFlags -> seq<Info>
Full name: Arrow-Notation-via-FSharp.Reflect.getConstructors
Multiple overloads
Type.GetConstructors() : ConstructorInfo []
Type.GetConstructors(bindingAttr: BindingFlags) : ConstructorInfo []
val x : ConstructorInfo
type: ConstructorInfo
implements: ICustomAttributeProvider
implements: Runtime.InteropServices._MemberInfo
implements: Runtime.InteropServices._MethodBase
implements: Runtime.InteropServices._ConstructorInfo
inherits: MethodBase
inherits: MemberInfo
val getMembers : BindingFlags -> BindingFlags -> BindingFlags -> BindingFlags -> BindingFlags -> obj -> seq<Info>
Full name: Arrow-Notation-via-FSharp.Reflect.getMembers
val fflags : BindingFlags
type: BindingFlags
inherits: Enum
inherits: ValueType
val pflags : BindingFlags
type: BindingFlags
inherits: Enum
inherits: ValueType
val eflags : BindingFlags
type: BindingFlags
inherits: Enum
inherits: ValueType
val mflags : BindingFlags
type: BindingFlags
inherits: Enum
inherits: ValueType
val cflags : BindingFlags
type: BindingFlags
inherits: Enum
inherits: ValueType
Multiple items
val seq : seq<'T> -> seq<'T>
Full name: Microsoft.FSharp.Core.Operators.seq
--------------------
type seq<'T> = Collections.Generic.IEnumerable<'T>
Full name: Microsoft.FSharp.Collections.seq<_>
type: seq<'T>
inherits: Collections.IEnumerable
val Static : BindingFlags
Full name: Arrow-Notation-via-FSharp.Static
type: BindingFlags
inherits: Enum
inherits: ValueType
field BindingFlags.Static = 8
field BindingFlags.NonPublic = 32
field BindingFlags.Public = 16
val Instance : BindingFlags
Full name: Arrow-Notation-via-FSharp.Instance
type: BindingFlags
inherits: Enum
inherits: ValueType
field BindingFlags.Instance = 4
val All : BindingFlags
Full name: Arrow-Notation-via-FSharp.All
type: BindingFlags
inherits: Enum
inherits: ValueType
val fscore : seq<Reflect.Info>
Full name: Arrow-Notation-via-FSharp.fscore
type: seq<Reflect.Info>
inherits: Collections.IEnumerable
module Reflect
from Arrow-Notation-via-FSharp
val getTypes : string -> seq<Reflect.Info>
Full name: Arrow-Notation-via-FSharp.Reflect.getTypes
val x : Reflect.Info
type: Reflect.Info
implements: IEquatable<Reflect.Info>
implements: Collections.IStructuralEquatable
union case Reflect.Info.Types: Type -> Reflect.Info
val getMembers : BindingFlags -> BindingFlags -> BindingFlags -> BindingFlags -> BindingFlags -> obj -> seq<Reflect.Info>
Full name: Arrow-Notation-via-FSharp.Reflect.getMembers
property MemberInfo.Name: string
val failwith : string -> 'T
Full name: Microsoft.FSharp.Core.Operators.failwith
val iter : ('T -> unit) -> seq<'T> -> unit
Full name: Microsoft.FSharp.Collections.Seq.iter
val x : seq<Reflect.Info>
type: seq<Reflect.Info>
inherits: Collections.IEnumerable
val y : string
type: string
implements: IComparable
implements: ICloneable
implements: IConvertible
implements: IComparable<string>
implements: seq<char>
implements: Collections.IEnumerable
implements: IEquatable<string>
val printfn : Printf.TextWriterFormat<'T> -> 'T
Full name: Microsoft.FSharp.Core.ExtraTopLevelOperators.printfn
union case Reflect.Info.Fields: FieldInfo -> Reflect.Info
union case Reflect.Info.Properties: PropertyInfo -> Reflect.Info
union case Reflect.Info.Events: EventInfo -> Reflect.Info
union case Reflect.Info.Methods: MethodInfo -> Reflect.Info
union case Reflect.Info.Constructors: ConstructorInfo -> Reflect.Info
val sum : int -> int -> int
Full name: Arrow-Notation-via-FSharp.sum
val a : int
type: int
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<int>
implements: IEquatable<int>
inherits: ValueType
val b : int
type: int
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<int>
implements: IEquatable<int>
inherits: ValueType
val mul : int -> int -> int
Full name: Arrow-Notation-via-FSharp.mul
val sqr : int -> int
Full name: Arrow-Notation-via-FSharp.sqr
val n : int
type: int
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<int>
implements: IEquatable<int>
inherits: ValueType
val drakeEq : int -> float -> float -> float -> float -> float -> int -> float
Full name: Arrow-Notation-via-FSharp.drakeEq
Multiple items
val R : int
type: int
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<int>
implements: IEquatable<int>
inherits: ValueType
--------------------
val R : int
type: int
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<int>
implements: IEquatable<int>
inherits: ValueType
val fp : float
type: float
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<float>
implements: IEquatable<float>
inherits: ValueType
val ne : float
type: float
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<float>
implements: IEquatable<float>
inherits: ValueType
val fl : float
type: float
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<float>
implements: IEquatable<float>
inherits: ValueType
val fi : float
type: float
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<float>
implements: IEquatable<float>
inherits: ValueType
val fc : float
type: float
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<float>
implements: IEquatable<float>
inherits: ValueType
Multiple items
val L : int
type: int
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<int>
implements: IEquatable<int>
inherits: ValueType
--------------------
val L : int
type: int
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<int>
implements: IEquatable<int>
inherits: ValueType
Multiple items
val float : 'T -> float (requires member op_Explicit)
Full name: Microsoft.FSharp.Core.Operators.float
--------------------
type float<'Measure> = float
Full name: Microsoft.FSharp.Core.float<_>
type: float<'Measure>
implements: IComparable
implements: IConvertible
implements: IFormattable
implements: IComparable<float<'Measure>>
implements: IEquatable<float<'Measure>>
inherits: ValueType
--------------------
type float = Double
Full name: Microsoft.FSharp.Core.float
type: float
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<float>
implements: IEquatable<float>
inherits: ValueType
val R : int
type: int
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<int>
implements: IEquatable<int>
inherits: ValueType
val L : int
type: int
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<int>
implements: IEquatable<int>
inherits: ValueType
Multiple items
val int : 'T -> int (requires member op_Explicit)
Full name: Microsoft.FSharp.Core.Operators.int
--------------------
type int<'Measure> = int
Full name: Microsoft.FSharp.Core.int<_>
type: int<'Measure>
implements: IComparable
implements: IConvertible
implements: IFormattable
implements: IComparable<int<'Measure>>
implements: IEquatable<int<'Measure>>
inherits: ValueType
--------------------
type int = int32
Full name: Microsoft.FSharp.Core.int
type: int
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<int>
implements: IEquatable<int>
inherits: ValueType
type 'a LinkedList =
| Empty
| Element of 'a * 'a LinkedList
Full name: Arrow-Notation-via-FSharp.LinkedList<_>
type: 'a LinkedList
implements: IEquatable<'a LinkedList>
implements: Collections.IStructuralEquatable
implements: IComparable<'a LinkedList>
implements: IComparable
implements: Collections.IStructuralComparable
union case LinkedList.Empty: 'a LinkedList
union case LinkedList.Element: 'a * 'a LinkedList -> 'a LinkedList
val drakeEq' : int * float * float * float * float * float * int -> float
Full name: Arrow-Notation-via-FSharp.drakeEq'
val xs : int LinkedList
Full name: Arrow-Notation-via-FSharp.xs
type: int LinkedList
implements: IEquatable<int LinkedList>
implements: Collections.IStructuralEquatable
implements: IComparable<int LinkedList>
implements: IComparable
implements: Collections.IStructuralComparable
val filter : ('T -> bool) -> seq<'T> -> seq<'T>
Full name: Microsoft.FSharp.Collections.Seq.filter
val x : int
type: int
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<int>
implements: IEquatable<int>
inherits: ValueType
val next : (int -> int)
Full name: Arrow-Notation-via-FSharp.next
val twice : (int -> int)
Full name: Arrow-Notation-via-FSharp.twice
val x : int
Full name: Arrow-Notation-via-FSharp.x
type: int
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<int>
implements: IEquatable<int>
inherits: ValueType
val foldr : ('a -> 'b -> 'b) -> 'b -> 'a LinkedList -> 'b
Full name: Arrow-Notation-via-FSharp.foldr
val f : ('a -> 'b -> 'b)
val acc : 'b
val xs : 'a LinkedList
type: 'a LinkedList
implements: IEquatable<'a LinkedList>
implements: Collections.IStructuralEquatable
implements: IComparable<'a LinkedList>
implements: IComparable
implements: Collections.IStructuralComparable
val foldr : ('a LinkedList -> ('b -> 'c) -> 'c)
val k : ('b -> 'c)
val x : 'a
val racc : 'b
val id : 'T -> 'T
Full name: Microsoft.FSharp.Core.Operators.id
val foldl : ('a -> 'b -> 'a) -> 'a -> 'b LinkedList -> 'a
Full name: Arrow-Notation-via-FSharp.foldl
val f : ('a -> 'b -> 'a)
val acc : 'a
val xs : 'b LinkedList
type: 'b LinkedList
implements: IEquatable<'b LinkedList>
implements: Collections.IStructuralEquatable
implements: IComparable<'b LinkedList>
implements: IComparable
implements: Collections.IStructuralComparable
val x : 'b
val identity : 'a LinkedList -> 'a LinkedList
Full name: Arrow-Notation-via-FSharp.identity
val reverse : 'a LinkedList -> 'a LinkedList
Full name: Arrow-Notation-via-FSharp.reverse
val length : 'a LinkedList -> int
Full name: Arrow-Notation-via-FSharp.length
val xs : int
type: int
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<int>
implements: IEquatable<int>
inherits: ValueType
val summation : int LinkedList -> int
Full name: Arrow-Notation-via-FSharp.summation
val xs : int LinkedList
type: int LinkedList
implements: IEquatable<int LinkedList>
implements: Collections.IStructuralEquatable
implements: IComparable<int LinkedList>
implements: IComparable
implements: Collections.IStructuralComparable
val product : int LinkedList -> int
Full name: Arrow-Notation-via-FSharp.product
val unfold : ('a -> 'b * 'a) -> ('a -> bool) -> 'a -> 'b LinkedList
Full name: Arrow-Notation-via-FSharp.unfold
val unspool : ('a -> 'b * 'a)
val finished : ('a -> bool)
val a : 'b
val y : 'a
val fibUntil : int -> int LinkedList
Full name: Arrow-Notation-via-FSharp.fibUntil
val until : int
type: int
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<int>
implements: IEquatable<int>
inherits: ValueType
val x : int * int
val b' : int
type: int
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<int>
implements: IEquatable<int>
inherits: ValueType
val fst : ('T1 * 'T2) -> 'T1
Full name: Microsoft.FSharp.Core.Operators.fst
val snd : ('T1 * 'T2) -> 'T2
Full name: Microsoft.FSharp.Core.Operators.snd
val fibs : int -> int LinkedList
Full name: Arrow-Notation-via-FSharp.fibs
val x : int ref
type: int ref
implements: Collections.IStructuralEquatable
implements: IComparable<Ref<int>>
implements: IComparable
implements: Collections.IStructuralComparable
Multiple items
val ref : 'T -> 'T ref
Full name: Microsoft.FSharp.Core.Operators.ref
--------------------
type 'T ref = Ref<'T>
Full name: Microsoft.FSharp.Core.ref<_>
type: 'T ref
implements: Collections.IStructuralEquatable
implements: IComparable<Ref<'T>>
implements: IComparable
implements: Collections.IStructuralComparable
val fibonacci : seq<Numerics.BigInteger>
Full name: Arrow-Notation-via-FSharp.fibonacci
type: seq<Numerics.BigInteger>
inherits: Collections.IEnumerable
val unfold : ('State -> ('T * 'State) option) -> 'State -> seq<'T>
Full name: Microsoft.FSharp.Collections.Seq.unfold
val x : Numerics.BigInteger
type: Numerics.BigInteger
implements: IFormattable
implements: IComparable
implements: IComparable<Numerics.BigInteger>
implements: IEquatable<Numerics.BigInteger>
inherits: ValueType
val y : Numerics.BigInteger
type: Numerics.BigInteger
implements: IFormattable
implements: IComparable
implements: IComparable<Numerics.BigInteger>
implements: IEquatable<Numerics.BigInteger>
inherits: ValueType
union case Option.Some: 'T -> Option<'T>
val nth : int -> seq<'T> -> 'T
Full name: Microsoft.FSharp.Collections.Seq.nth
namespace Microsoft
module SfsWrapper
type MeasureAttribute =
class
inherit Attribute
new : unit -> MeasureAttribute
end
Full name: Microsoft.FSharp.Core.MeasureAttribute
type: MeasureAttribute
implements: Runtime.InteropServices._Attribute
inherits: Attribute
[<Measure>]
type Year
Full name: Arrow-Notation-via-FSharp.Year
[<Measure>]
type Star
Full name: Arrow-Notation-via-FSharp.Star
[<Measure>]
type Planet
Full name: Arrow-Notation-via-FSharp.Planet
[<Measure>]
type LifeCapible =/Star
Full name: Arrow-Notation-via-FSharp.LifeCapible
[<Measure>]
type Life = Planet/LifeCapible
Full name: Arrow-Notation-via-FSharp.Life
[<Measure>]
type IntelligentLife = Planet/Life
Full name: Arrow-Notation-via-FSharp.IntelligentLife
[<Measure>]
type CommunicatingIntelligentLife = Planet/IntelligentLife
Full name: Arrow-Notation-via-FSharp.CommunicatingIntelligentLife
[<Measure>]
type Civilization
Full name: Arrow-Notation-via-FSharp.Civilization
val context : 'a
Full name: Arrow-Notation-via-FSharp.context
val drake : SfsModel
Full name: Arrow-Notation-via-FSharp.drake
type SfsModel =
class
new : context:'a -> SfsModel
member Abs : x:SfsRealTerm<'u> -> 'a
member Abs : x:SfsIntTerm<'u> -> 'a
member AddConstraint : term:'_arg96 -> 'a
member AddConstraint : name:'a * term:'b -> 'c
member AddConstraints : terms:'_arg72 [] -> 'a
member AddConstraints : name:'a * terms:'b -> 'c
member AddGoal : goalKind:'a * objective:SfsIntTerm<'u> -> 'b
member AddGoal : goalKind:'a * objective:SfsRealTerm<'u> -> 'b
member AddGoal : name:'a * goalKind:'b * objective:SfsIntTerm<'u> -> 'c
member AddGoal : name:'a * goalKind:'b * objective:SfsRealTerm<'u> -> 'c
member AllDifferent : args:SfsRealTerm<'u> [] -> 'a
member AllDifferent : args:SfsIntTerm<'u> [] -> 'a
member AllDifferent : args:SfsSymbolicVariable<'b> [] -> 'a
member And : args:SfsBooleanTerm [] -> 'a
member AtMostMofN : m:'a * args:SfsBooleanTerm array -> 'b
member CreateBooleanVariable : unit -> 'a
member CreateBooleanVariable : name:'a -> 'b
member CreateIntConstant : x:int<'u> -> SfsIntTerm<'u>
member CreateIntNonnegativeVariable : unit -> 'a
member CreateIntNonnegativeVariable : name:'a -> 'b
member CreateIntRangeVariable : min:'a * max:'b -> 'c
member CreateIntRangeVariable : min:int<'u> * max:int<'u> * name:'a -> 'b
member CreateIntSetVariable : allowedValues:'a -> 'b
member CreateIntSetVariable : allowedValues:Set<int<'u>> * name:'a -> 'b
member CreateIntVariable : unit -> 'a
member CreateIntVariable : name:'a -> 'b
member CreateRealConstant : x:float<'u> -> SfsRealTerm<'u>
member CreateRealNonnegativeVariable : unit -> 'a
member CreateRealNonnegativeVariable : name:'a -> 'b
member CreateRealRangeVariable : min:'a * max:'b -> 'c
member CreateRealRangeVariable : min:float<'u> * max:float<'u> * name:'a -> 'b
member CreateRealSetVariable : allowedValues:'a -> 'b
member CreateRealSetVariable : allowedValues:Set<float<'u>> -> 'a
member CreateRealSetVariable : allowedValues:'a * name:'b -> 'c
member CreateRealSetVariable : allowedValues:Set<float<'u>> * name:'a -> 'b
member CreateRealVariable : unit -> int
member CreateRealVariable : name:'a -> 'b
member CreateSymbolicVariable : unit -> 'a
member CreateSymbolicVariable : name:'a -> 'b
member Difference : l:SfsRealTerm<'u> * r:SfsRealTerm<'u> -> 'a
member Difference : l:SfsIntTerm<'u 'w> * r:SfsIntTerm<'u 'w> -> 'a
member Equal : args:SfsRealTerm<'u> [] -> 'a
member Equal : args:SfsIntTerm<'u> [] -> 'a
member Equal : args:SfsSymbolicVariable<'a> [] -> 'b
member ExactlyMofN : m:'a * args:SfsBooleanTerm array -> 'b
member ForEach : args:'a array * f:('a -> SfsBooleanTerm) -> 'b
member ForEachWhere : args:'a array * predicate:('a -> SfsBooleanTerm) * f:('a -> SfsBooleanTerm) -> 'b
member Greater : args:SfsRealTerm<'u> [] -> 'a
member Greater : args:SfsIntTerm<'u> [] -> 'a
member GreaterEqual : args:SfsRealTerm<'u> [] -> 'a
member GreaterEqual : args:SfsIntTerm<'u> [] -> 'a
member Less : args:SfsRealTerm<'u> [] -> 'a
member Less : args:SfsIntTerm<'u> [] -> 'a
member LessEqual : args:SfsRealTerm<'u> [] -> 'a
member LessEqual : args:SfsIntTerm<'u> [] -> 'a
member Negate : x:SfsRealTerm<'u> -> 'a
member Negate : x:SfsIntTerm<'u> -> 'a
member Not : arg:SfsBooleanTerm -> 'a (requires 'a :> SfsBooleanTerm)
member Or : args:SfsBooleanTerm [] -> 'a
member internal Product : l:'a * r:'a -> 'a
member RemoveConstraint : c:SfsConstraint -> 'a
member RemoveGoal : g:'a -> 'b (requires 'a :> SfsGoal)
member SaveModel : format:'a * writer:'b -> 'c
member Solve : directives:'a -> 'b
member Solve : directive:'a -> 'b
member Solve : x:'a -> 'b
member Square : x:SfsRealTerm<'u> -> 'a
member Square : x:SfsIntTerm<'u> -> 'a
member Sum : args:SfsRealTerm<'u> array -> 'a
member Sum : args:SfsIntTerm<'u 'w> array -> 'a
member Sum : args:SfsRealVariable<'u> array -> 'a
member Sum : args:SfsIntVariable<'u> array -> 'a
member False : 'a
member Model : 'a
member True : 'a
end
Full name: SfsWrapper.SfsWrapper.SfsModel
Describes a Solver Foundation model, i.e., a problem description with
variables, constraints, objectives, etc.
val R : int
Full name: Arrow-Notation-via-FSharp.R
type: int
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<int>
implements: IEquatable<int>
inherits: ValueType
Multiple overloads
member SfsModel.CreateRealVariable : unit -> int
Creates a real valued (float) decision variable with unit-of-measure, and
adds it to the model
member SfsModel.CreateRealVariable : name:'a -> 'b
Creates a real valued (float) decision variable with unit-of-measure, and
adds it to the model
val fp : int
Full name: Arrow-Notation-via-FSharp.fp
type: int
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<int>
implements: IEquatable<int>
inherits: ValueType
val ne : int
Full name: Arrow-Notation-via-FSharp.ne
type: int
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<int>
implements: IEquatable<int>
inherits: ValueType
val fl : int
Full name: Arrow-Notation-via-FSharp.fl
type: int
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<int>
implements: IEquatable<int>
inherits: ValueType
val fi : int
Full name: Arrow-Notation-via-FSharp.fi
type: int
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<int>
implements: IEquatable<int>
inherits: ValueType
val fc : int
Full name: Arrow-Notation-via-FSharp.fc
type: int
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<int>
implements: IEquatable<int>
inherits: ValueType
val L : int
Full name: Arrow-Notation-via-FSharp.L
type: int
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<int>
implements: IEquatable<int>
inherits: ValueType
val N : int
Full name: Arrow-Notation-via-FSharp.N
type: int
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<int>
implements: IEquatable<int>
inherits: ValueType
Multiple overloads
member SfsModel.AddConstraints : terms:'_arg72 [] -> 'a
Adds a list of boolean terms as constraints
member SfsModel.AddConstraints : name:'a * terms:'b -> 'c
Adds a list of boolean terms as constraints
val cR : 'a
Full name: Arrow-Notation-via-FSharp.cR
Multiple overloads
member SfsModel.AddConstraint : term:'_arg96 -> 'a
Adds a single boolean term as a constraint
member SfsModel.AddConstraint : name:'a * term:'b -> 'c
Adds a single boolean term as a constraint
val cfp : 'a
Full name: Arrow-Notation-via-FSharp.cfp
val cne : 'a
Full name: Arrow-Notation-via-FSharp.cne
val cfl : 'a
Full name: Arrow-Notation-via-FSharp.cfl
val cfi : 'a
Full name: Arrow-Notation-via-FSharp.cfi
val cfc : 'a
Full name: Arrow-Notation-via-FSharp.cfc
val cL : 'a
Full name: Arrow-Notation-via-FSharp.cL
val cN : 'a
Full name: Arrow-Notation-via-FSharp.cN
val minimumLifeCapible : 'a
Full name: Arrow-Notation-via-FSharp.minimumLifeCapible
Multiple overloads
member SfsModel.AddGoal : goalKind:'a * objective:SfsIntTerm<'u> -> 'b
Adds a numerical term as an objective function (goal)
member SfsModel.AddGoal : goalKind:'a * objective:SfsRealTerm<'u> -> 'b
Adds a numerical term as an objective function (goal)
member SfsModel.AddGoal : name:'a * goalKind:'b * objective:SfsIntTerm<'u> -> 'c
Adds a numerical term as an objective function (goal)
member SfsModel.AddGoal : name:'a * goalKind:'b * objective:SfsRealTerm<'u> -> 'c
Adds a numerical term as an objective function (goal)
val solution : 'a
Full name: Arrow-Notation-via-FSharp.solution
Multiple overloads
member SfsModel.Solve : directives:'a -> 'b
Solves the program, with a given solver or a set of solvers in parallel.
Use this when solvers need to be parameterized
member SfsModel.Solve : directive:'a -> 'b
Solves the program, with a given solver in its default configuration
member SfsModel.Solve : x:'a -> 'b
Solves the program using a simplex solver
union case SolverDirectives.LocalSearch: SolverDirectives
Solver Foundation is really fun to play with and the samples that come with it are great! But I’ll save a post on it for later. F# 3.0 will ship with a feature called “Type Providers” which will make it trivial to retrieve values for these variables from existing data sources in the cloud.

Nice post! I liked the way you approached currying by the means of F# code. I found that is a good exercise to read the compiled code from a C# perspective to see how ‘functions are data’ works.
regards