Array vs List in Elm
List
is a linked list which provides O(n) lookup time based on index. Getting an element by index requires traversing the list over n
nodes. An index lookup function for List
isn't available in the core library but you can use the elm-community/list-extra package which provides two functions for lookup (varying by parameter order): !!
and getAt
.
Array
allows for O(log n) index lookup. Index lookups on Array
can be done using Array.get
. Arrays are represented as Relaxed Radix Balanced Trees.
Both are immutable (all values in Elm are immutable), so you have trade-offs depending on your situation. List
is great when you make a lot of changes because you are merely updating linked list pointers, whereas Array
is great for speedy lookup but has somewhat poorer performance for modifications, which you'll want to consider if you're making a lot of changes.
Something like this should work:
import Array
import Debug
fromJust : Maybe a -> a
fromJust x = case x of
Just y -> y
Nothing -> Debug.crash "error: fromJust Nothing"
selectFromList : List a -> List Int -> List a
selectFromList els idxs =
let arr = Array.fromList els
in List.map (\i -> fromJust (Array.get i arr)) idxs
It converts the input list to an array for fast indexing, then maps the list of indices to their corresponding values in the array. I took the fromJust
function from this StackOverflow question.