Array vs List in Elm

后端 未结 3 1718
感情败类
感情败类 2021-02-12 12:32

I was suprised to learn that Array and List were two different types in Elm:

  • Array

  • List

In my case,

相关标签:
3条回答
  • 2021-02-12 12:49

    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.

    0 讨论(0)
  • 2021-02-12 12:49

    Only use Array if you need to use Array.get.

    In most cases you should use List because usually you can do everything you need with foldl, map, etc. without having to get items from an index, and List has better performance with these functions.

    0 讨论(0)
  • 2021-02-12 12:58

    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.

    0 讨论(0)
提交回复
热议问题