
I'm on day 2 of learning Haskell, and decided to write a program to find Keith Numbers as my first project. So far so good, I have some code that does the job (see below). First I would just like to ask others to look it over and let me know if I am doing anything particularly wrong or not advised here. Also, I am using the "isKeithHelper" function because I didn't know how to make use of the filter function directly with isKeith, because isKeith takes two parameters. I'm pretty sure there is a better way to handle that, any tips? Lastly, I'd like to make this as efficient as possible. At the moment I am adding [s] to the end of the list in the isKeith function, which I know is O(n) instead of O(1). I don't think there is a way to avoid either that or having to use drop which would have the same downside. Is this a case where a Sequence or Vector might be more useful? How would I convert this to use a Sequence instead? import Data.Time.Clock.POSIX import Data.Digits isKeith :: Integer -> [Integer] -> Bool isKeith n l | s == n = True | s > n = False | otherwise = isKeith n x (l ++ [s]) where s = sum l isKeithHelper :: Integer -> Bool isKeithHelper n = isKeith n (digits 10 n) main :: IO () main = do start <- getPOSIXTime print (filter isKeithHelper [1000..9999]) end <- getPOSIXTime print (end - start)