Tomas recently posted a terrific new tool called F# Web Snippets. You can read a bit on his blog, but you can get an immediate feel right here:
open System
open System.Numerics
let maxIteration = 100
let modSquared (c : Complex) = c.Real * c.Real + c.Imaginary * c.Imaginary
type MandelbrotResult =
| DidNotEscape
| Escaped of int
let mandelbrot c =
let rec mandelbrotInner z iterations =
if(modSquared z >= 4.0)
then Escaped iterations
elif iterations = maxIteration
then DidNotEscape
else mandelbrotInner ((z * z) + c) (iterations + 1)
mandelbrotInner c 0
let chars = " .:-;!/>)|&IH%*#"
for y in [-1.2..0.05..1.2] do
for x in [-2.0..0.025..0.9] do
match mandelbrot(Complex(x, y)) with
| DidNotEscape -> Console.Write " "
| Escaped i -> Console.Write chars.[i &&& 15]
Console.WriteLine() F# Web Snippets
namespace System
namespace System.Numerics
val maxIteration : int
Full name: Untitled.maxIteration
type: int
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<int>
implements: IEquatable<int>
inherits: ValueType
val modSquared : Complex -> float
Full name: Untitled.modSquared
val c : Complex
type: Complex
implements: IEquatable<Complex>
implements: IFormattable
inherits: ValueType
type Complex =
struct
new : float * float -> System.Numerics.Complex
member Equals : obj -> bool
member Equals : System.Numerics.Complex -> bool
member GetHashCode : unit -> int
member Imaginary : float
member Magnitude : float
member Phase : float
member Real : float
member ToString : unit -> string
member ToString : string -> string
member ToString : System.IFormatProvider -> string
member ToString : string * System.IFormatProvider -> string
static val Zero : System.Numerics.Complex
static val One : System.Numerics.Complex
static val ImaginaryOne : System.Numerics.Complex
static member Abs : System.Numerics.Complex -> float
static member Acos : System.Numerics.Complex -> System.Numerics.Complex
static member Add : System.Numerics.Complex * System.Numerics.Complex -> System.Numerics.Complex
static member Asin : System.Numerics.Complex -> System.Numerics.Complex
static member Atan : System.Numerics.Complex -> System.Numerics.Complex
static member Conjugate : System.Numerics.Complex -> System.Numerics.Complex
static member Cos : System.Numerics.Complex -> System.Numerics.Complex
static member Cosh : System.Numerics.Complex -> System.Numerics.Complex
static member Divide : System.Numerics.Complex * System.Numerics.Complex -> System.Numerics.Complex
static member Exp : System.Numerics.Complex -> System.Numerics.Complex
static member FromPolarCoordinates : float * float -> System.Numerics.Complex
static member Log : System.Numerics.Complex -> System.Numerics.Complex
static member Log : System.Numerics.Complex * float -> System.Numerics.Complex
static member Log10 : System.Numerics.Complex -> System.Numerics.Complex
static member Multiply : System.Numerics.Complex * System.Numerics.Complex -> System.Numerics.Complex
static member Negate : System.Numerics.Complex -> System.Numerics.Complex
static member Pow : System.Numerics.Complex * System.Numerics.Complex -> System.Numerics.Complex
static member Pow : System.Numerics.Complex * float -> System.Numerics.Complex
static member Reciprocal : System.Numerics.Complex -> System.Numerics.Complex
static member Sin : System.Numerics.Complex -> System.Numerics.Complex
static member Sinh : System.Numerics.Complex -> System.Numerics.Complex
static member Sqrt : System.Numerics.Complex -> System.Numerics.Complex
static member Subtract : System.Numerics.Complex * System.Numerics.Complex -> System.Numerics.Complex
static member Tan : System.Numerics.Complex -> System.Numerics.Complex
static member Tanh : System.Numerics.Complex -> System.Numerics.Complex
end
Full name: System.Numerics.Complex
type: Complex
implements: IEquatable<Complex>
implements: IFormattable
inherits: ValueType
property Complex.Real: float
property Complex.Imaginary: float
type MandelbrotResult =
| DidNotEscape
| Escaped of int
Full name: Untitled.MandelbrotResult
type: MandelbrotResult
implements: IEquatable<MandelbrotResult>
implements: Collections.IStructuralEquatable
implements: IComparable<MandelbrotResult>
implements: IComparable
implements: Collections.IStructuralComparable
union case MandelbrotResult.DidNotEscape: MandelbrotResult
union case MandelbrotResult.Escaped: int -> MandelbrotResult
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
val mandelbrot : Complex -> MandelbrotResult
Full name: Untitled.mandelbrot
val mandelbrotInner : (Complex -> int -> MandelbrotResult)
val z : Complex
type: Complex
implements: IEquatable<Complex>
implements: IFormattable
inherits: ValueType
val iterations : int
type: int
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<int>
implements: IEquatable<int>
inherits: ValueType
val chars : string
Full name: Untitled.chars
type: string
implements: IComparable
implements: ICloneable
implements: IConvertible
implements: IComparable<string>
implements: seq<char>
implements: Collections.IEnumerable
implements: IEquatable<string>
val y : float
type: float
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<float>
implements: IEquatable<float>
inherits: ValueType
val x : float
type: float
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<float>
implements: IEquatable<float>
inherits: ValueType
type Console =
class
static member BackgroundColor : System.ConsoleColor with get, set
static member Beep : unit -> unit
static member Beep : int * int -> unit
static member BufferHeight : int with get, set
static member BufferWidth : int with get, set
static member CapsLock : bool
static member Clear : unit -> unit
static member CursorLeft : int with get, set
static member CursorSize : int with get, set
static member CursorTop : int with get, set
static member CursorVisible : bool with get, set
static member Error : System.IO.TextWriter
static member ForegroundColor : System.ConsoleColor with get, set
static member In : System.IO.TextReader
static member InputEncoding : System.Text.Encoding with get, set
static member KeyAvailable : bool
static member LargestWindowHeight : int
static member LargestWindowWidth : int
static member MoveBufferArea : int * int * int * int * int * int -> unit
static member MoveBufferArea : int * int * int * int * int * int * char * System.ConsoleColor * System.ConsoleColor -> unit
static member NumberLock : bool
static member OpenStandardError : unit -> System.IO.Stream
static member OpenStandardError : int -> System.IO.Stream
static member OpenStandardInput : unit -> System.IO.Stream
static member OpenStandardInput : int -> System.IO.Stream
static member OpenStandardOutput : unit -> System.IO.Stream
static member OpenStandardOutput : int -> System.IO.Stream
static member Out : System.IO.TextWriter
static member OutputEncoding : System.Text.Encoding with get, set
static member Read : unit -> int
static member ReadKey : unit -> System.ConsoleKeyInfo
static member ReadKey : bool -> System.ConsoleKeyInfo
static member ReadLine : unit -> string
static member ResetColor : unit -> unit
static member SetBufferSize : int * int -> unit
static member SetCursorPosition : int * int -> unit
static member SetError : System.IO.TextWriter -> unit
static member SetIn : System.IO.TextReader -> unit
static member SetOut : System.IO.TextWriter -> unit
static member SetWindowPosition : int * int -> unit
static member SetWindowSize : int * int -> unit
static member Title : string with get, set
static member TreatControlCAsInput : bool with get, set
static member WindowHeight : int with get, set
static member WindowLeft : int with get, set
static member WindowTop : int with get, set
static member WindowWidth : int with get, set
static member Write : bool -> unit
static member Write : char -> unit
static member Write : char [] -> unit
static member Write : float -> unit
static member Write : decimal -> unit
static member Write : float32 -> unit
static member Write : int -> unit
static member Write : uint32 -> unit
static member Write : int64 -> unit
static member Write : uint64 -> unit
static member Write : obj -> unit
static member Write : string -> unit
static member Write : string * obj -> unit
static member Write : string * obj [] -> unit
static member Write : string * obj * obj -> unit
static member Write : char [] * int * int -> unit
static member Write : string * obj * obj * obj -> unit
static member Write : string * obj * obj * obj * obj -> unit
static member WriteLine : unit -> unit
static member WriteLine : bool -> unit
static member WriteLine : char -> unit
static member WriteLine : char [] -> unit
static member WriteLine : decimal -> unit
static member WriteLine : float -> unit
static member WriteLine : float32 -> unit
static member WriteLine : int -> unit
static member WriteLine : uint32 -> unit
static member WriteLine : int64 -> unit
static member WriteLine : uint64 -> unit
static member WriteLine : obj -> unit
static member WriteLine : string -> unit
static member WriteLine : string * obj -> unit
static member WriteLine : string * obj [] -> unit
static member WriteLine : char [] * int * int -> unit
static member WriteLine : string * obj * obj -> unit
static member WriteLine : string * obj * obj * obj -> unit
static member WriteLine : string * obj * obj * obj * obj -> unit
end
Full name: System.Console
Multiple overloads
Console.Write(value: string) : unit
Console.Write(value: obj) : unit
Console.Write(value: uint64) : unit
Console.Write(value: int64) : unit
Console.Write(value: uint32) : unit
Console.Write(value: int) : unit
Console.Write(value: float32) : unit
Console.Write(value: decimal) : unit
Console.Write(value: float) : unit
Console.Write(buffer: char []) : unit
(+8 other overloads)
val i : int
type: int
implements: IComparable
implements: IFormattable
implements: IConvertible
implements: IComparable<int>
implements: IEquatable<int>
inherits: ValueType
Multiple overloads
Console.WriteLine() : unit
Console.WriteLine(value: string) : unit
Console.WriteLine(value: obj) : unit
Console.WriteLine(value: uint64) : unit
Console.WriteLine(value: int64) : unit
Console.WriteLine(value: uint32) : unit
Console.WriteLine(value: int) : unit
Console.WriteLine(value: float32) : unit
Console.WriteLine(value: float) : unit
Console.WriteLine(value: decimal) : unit
(+9 other overloads)
In addition to just nicely colorizing the F# code, it provides hover tooltips in your browser, much like you’d get from Visual Studio. Go ahead and hover over the identifier “maxIteration” and see that it is an “int”, for example. It’s awesome, right?
(By the way, yes, the Mandelbrot code I stole mercilessly from Luke’s recent timely blog.)
Anyway, Tomas’ tool is so cool I had to immediately try it out in a blog post before I went to sleep tonight. Here’s the output of the program, by the way:
With PDC coming soon, one imagines there may be other exciting F#-related announcements coming soon as well!