Pain Points of Haskell
&gt; In fact, the main reason Strings are slow is that their linked-list structure has a lot of overhead, and may be scattered around in memory.<p>This is almost entirely a myth in the context of Garbage Collected languages. Most popular GC&#x27;d languages use a copying and compacting garbage collector. They should follow the pointers when copying and put the list together in one place. Furthermore, if the compiler were to mark the list as contiguous memory region of the same type (data&#x2F;data pointer and one pointer to the next link), it could jump directly to the Nth element with the same performance as a real array (assuming you do bounds checking). The only significant difference is when you get long lists and due to the doubled size, you can&#x27;t fit them in a cache line, but that&#x27;s not a huge issue for most lists or arrays. If cache lines are actually that much of an issue for most programs, then b-trees are a much, much larger issue as they tend to hold more data for longer and necessarily can&#x27;t be lined up in access order.<p>I believe another factor is too much dynamic experience. With a dynamic language like lisp, list items generally won&#x27;t be carrying their own types. Instead, the list will be pointers to a boxed value where the box contains type info. Implementing in a language like Haskell with the requirement of static types should (in theory anyway) decrease the need for unboxing and radically improve performance (I believe common lisp type hints also reduce the need to box everything).<p>It is also possible to have a linked list pattern, but not a linked list implementation. Javascript is a good example here. You can add&#x2F;remove at both ends and even splice to add&#x2F;remove in the middle too. For years, everyone implemented all the lists as linked lists. Today, they mostly use arrays with fill pointers. Add&#x2F;removing at the beginning and middle takes a performance hit, but the much more common pushing to the end does not (until you exceed the array size). You can add a start pointer offset to an array and decrease penalties for pushing the beginning too.