mirror of
https://github.com/Smaug123/fsharp-vectors
synced 2025-10-08 21:08:40 +00:00
Create README.md
This commit is contained in:
38
README.md
Normal file
38
README.md
Normal 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.
|
Reference in New Issue
Block a user