Try and train yourself out of the habit of adding a single entry to the start of a list by using ++ and instead cons it on the front with :.
E.g., write
every n (x:xs) = x : every n (drop (n-1) xs)
-- Rather than
every n (x:xs) [x] ++ every n (drop (n-1) xs)
(:) is O(1) because you're just adding a node to the head of a linked list, whereas ++ is O(n) in the length of the first list because Haskell has to walk to the end of the first list before appending the second one.
Although it doesn't really matter here because the first list is only length one, it's an antipattern one tries to avoid. e.g. compare the runtime performance of
Thank you for this! Really useful. I'm planning to carry Haskell on past the advent of code, I feel like it is not a quick language to get competent in!
Out of interest, in what capacity do you teach into Haskell?
Looks good!
Try and train yourself out of the habit of adding a single entry to the start of a list by using
++
and instead cons it on the front with:
.E.g., write
(:)
is O(1) because you're just adding a node to the head of a linked list, whereas++
is O(n) in the length of the first list because Haskell has to walk to the end of the first list before appending the second one.Although it doesn't really matter here because the first list is only length one, it's an antipattern one tries to avoid. e.g. compare the runtime performance of
(Getting ready to teach intro Haskell again...)