Very interesting, thank you for sharing!
I wanted to add a couple notes and ideas that I've had separately.
Syntax
I was formerly somewhat keen on having special syntax for other
collections. For example, OCaml allows you to say [| 1, 2, 3 |] to create
an array. Hassan made a really nice proposal
<https://github.com/elm-lang/elm-plans/issues/12> to have it be #[ 1, 2, 3
] back in 2015. Since then I realized you can do the following:
a = Array.fromList
s = Set.fromList
d = Dict.fromList
array =
(a[ 1, 2, 3 ])
set =
(s[ 1, 2, 3 ])
dict =
(d[ 1 => "Tom", 2 => "Sue", 3 => "Jane" ])
(=>) = (,)
This is 1 or 2 characters off all the proposals out there, and it is
visually much nicer in my opinion.
With that knowledge, the case for special syntax seems significantly
weaker. I can also imagine detecting when a list is converted to something
else and doing something more clever in the compiler. That path seems
better overall to me.
List performance of map, foldl, and foldr
I shared this blog post <https://blogs.janestreet.com/optimizing-list-map/> about
optimizing List.map in OCaml a while ago, and Fred did some excellent work
on this <https://github.com/elm-lang/core/pull/707>! I have not had a
chance to fully assess the impact on generated code size, so I have not
merged it in yet. That trick can likely be very helpful for foldl and
foldr, but no one has looked into it.
I suspect there are many creative things we can do if some focused energy
was applied to lists. I have not taken a comprehensive look at this after
Elm got TCO, and I suspect we can do better!
Alternate Implementations of List
Another thing to consider before switching to some other data structure is
that we can change the performance profile of List using various techniques
behind the scenes. For example:
- Skip Lists <https://en.wikipedia.org/wiki/Skip_list>
- Finger Trees <https://en.wikipedia.org/wiki/Finger_tree> that maybe do
some sort of "compression" on older leaves
- I believe there's one that immutable.js does for their lists? Richard
told me about something like this. Where "old" nodes grow exponentially in
size so the nodes are 1, 2, 4, 8, etc. so it is faster to hop around and
you get better locality. Do you recall what this was called Richard?
I also think that manually recursing through lists with a case is
relatively common, at least in my experience, so I think it'd be good to
explore concrete bottlenecks in Elm code and see if there are not creative
things we can do to improve the performance profile of List without
changing it completely.
Anyway, exciting to see your work as always! And hopefully these ideas are
helpful!
Evan
Post by Robin Heggelund HansenI've been doing some thinking on how to improve Arrays in Elm. The result
https://docs.google.com/document/d/1Z8IC5qk98ISQLP_xKXNOHScCfzkQ8jCVSiYd1SxObB4/edit?usp=sharing
The document is quite large, but most of it are benchmark results
comparing Arrays and Lists.
There are some questions at the bottom of the document that I would love
to get feedback on.
--
You received this message because you are subscribed to the Google Groups "Elm Discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email to elm-discuss+***@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.