[Haskell-beginners] Finding Keith Numbers with Haskell

Jack Mott jack.mott at gmail.com
Tue Nov 11 00:32:14 UTC 2014

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])
        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)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20141110/1d202443/attachment.html>

More information about the Beginners mailing list