You are reading a single comment by @wjrh and its replies. Click here to read the full conversation.
  • 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

    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

    rev :: [a] -> [a]
    rev (x:xs) = rev xs ++ [x]
    rev [] = []
    -- with
    
    rev' :: [a] -> [a]
    rev' xs = revH xs []
      where
        revH (x:xs) ys = revH xs (x:ys)
        revH [] ys = ys
    

    (Getting ready to teach intro Haskell again...)

  • 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?

  • Out of interest, in what capacity do you teach into Haskell?

    At Durham. As a day job, I do applied maths and computational science.

About

Avatar for wjrh @wjrh started