F# Units of Measure for primitive non-numeric types by Eirik Tsarpalis. Compatible with Fable.
Add the FSharp.UMX
package from Nuget or just copy the src/FSharp.UMX.fs
file.
Run npm i && npm run build publish
.
open FSharp.UMX
[<Measure>] type customerId
[<Measure>] type orderId
[<Measure>] type kg
type Order =
{
id : string<orderId>
customer : string<customerId>
quantity : int<kg>
}
let order =
{
id = % "orderId"
customer = % "customerId"
quantity = % 42
}
let printOrder (order : Order) =
printfn "orderId=%s customerId=%s quantity=%d" %order.id %order.customer %order.quantity
let lookupById (orders : Order list) (id : string<orderId>) = orders |> List.tryFind (fun o -> o.id = id)
lookupById [] order.id // compiles
lookupById [] order.customer // compiler error
// stdin(94,15): error FS0001: Type mismatch. Expecting a
// 'string<orderId>'
// but given a
// 'string<customerId>'
// The unit of measure 'orderId' does not match the unit of measure 'customerId'