Skip to content

Latest commit

 

History

History
38 lines (26 loc) · 897 Bytes

README.md

File metadata and controls

38 lines (26 loc) · 897 Bytes

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.