Create README.md

This commit is contained in:
Patrick Stevens
2020-05-02 15:36:32 +01:00
committed by GitHub
parent 8e3cd2a1a1
commit accd4339a7

38
README.md Normal file
View File

@@ -0,0 +1,38 @@
# fsharp-vectors
Type-safe vectors in F#.
# What?
```fsharp
let l1 = [ 1 ; 2 ]
let l2 = [ 3 ]
List.zip l1 l2
|> ignore
```
Oh no! Lists aren't safe!
```fsharp
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.