Last year, inspired by F#’s built-in compile-time Units of Measure feature I developed a small run-time library for units.
Last week I created a short F# spreadsheet script, harvesting code from the open source project Cellz. The script is hosted on the F# Snippets site and can be run inside your browser using the Try F# Silverlight-based web app.
Over the last few days I’ve put the 2 together. The Silverlight application below demonstrates the spreadsheet script and the run-time units library combined.
Inside the spreadsheet units can be appended to numbers, e.g.
Type signatures:
type UnitType =
| Empty
| Unit of string * int
| CompositeUnit of UnitType list
with
override ToString : unit -> string
static member ( + ) : lhs:UnitType * rhs:UnitType -> UnitType
static member ( / ) : lhs:UnitType * rhs:UnitType -> UnitType
static member ( * ) : lhs:UnitType * rhs:UnitType -> UnitType
static member ( * ) : v:ValueType * u:UnitType -> UnitValue
end
and ValueType = decimal
and UnitValue =
class
interface IComparable
new : v:ValueType -> UnitValue
new : v:ValueType * s:string -> UnitValue
new : v:ValueType * u:UnitType -> UnitValue
override Equals : that:obj -> bool
override GetHashCode : unit -> int
override ToString : unit -> string
member Unit : UnitType
member Value : ValueType
static member One : UnitValue
static member Pow : lhs:UnitValue * rhs:UnitValue -> UnitValue
static member ( + ) : lhs:UnitValue * rhs:UnitValue -> UnitValue
static member ( / ) : lhs:UnitValue * rhs:UnitValue -> UnitValue
static member ( / ) : lhs:UnitValue * rhs:ValueType -> UnitValue
static member ( / ) : v:UnitValue * u:UnitType -> UnitValue
static member ( * ) : lhs:UnitValue * rhs:UnitValue -> UnitValue
static member ( * ) : lhs:UnitValue * rhs:ValueType -> UnitValue
static member ( * ) : v:UnitValue * u:UnitType -> UnitValue
static member ( - ) : lhs:UnitValue * rhs:UnitValue -> UnitValue
static member ( ~- ) : v:UnitValue -> UnitValue
end
Resources: