mirror of
https://github.com/Smaug123/fsharp-vectors
synced 2025-10-05 19:38:40 +00:00
accd4339a7aad879e839878472cdef60a8552e59
fsharp-vectors
Type-safe vectors in F#.
What?
let l1 = [ 1 ; 2 ]
let l2 = [ 3 ]
List.zip l1 l2
|> ignore
Oh no! Lists aren't safe!
let v1 = 1 ** 2 ** -()
let v2 = 1 ** ()
Vector.zip v1 v2 // doesn't compile!
|> ignore
How?
Peano encoding of the naturals, basically.
We define a type Z
and a type S : * -> *
, and interpret S Z
as the number 1.
Syntax
I refuse to apologise for the syntax.
Vector.empty
can also be written-()
. (It's actually an overload of the unary-
.)Vector.cons
can also be written**
. (It had to be this way because we need right-associativity, and not that many symbols in F# have right-associativity.)
Efficiency
These things are actually not that bad at runtime, although on no account should you use VectorCrate
on the hot path.
I have yet to do any benchmarking, but I think they'll be pretty good.
Description
Languages
F#
100%