99 questions/Solutions/4

From HaskellWiki
< 99 questions‎ | Solutions
Revision as of 13:04, 15 May 2014 by EduardNicodei (talk | contribs) (Add description for each type of solution. Change formatting, ensure that all code is enclosed in "haskell" braces.)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

(*) Find the number of elements of a list.

The simple, recursive solution. This is similar to the length from Prelude:

myLength           :: [a] -> Int
myLength []        =  0
myLength (_:xs)    =  1 + myLength xs

The prelude for haskell 2010 can be found here.

Same, but now we use an "accumulator" argument.

myLength :: [a] -> Int
myLength list = myLength_acc list 0
	where
		myLength_acc [] n = n
		myLength_acc (_:xs) n = myLength_acc xs (n + 1)

Using foldl/foldr:

myLength :: [a] -> Int
myLength1 =  foldl (\n _ -> n + 1) 0
myLength2 =  foldr (\_ n -> n + 1) 0
myLength3 =  foldr (\_ -> (+1)) 0
myLength4 =  foldr ((+) . (const 1)) 0
myLength5 =  foldr (const (+1)) 0
myLength6 =  foldl (const . (+1)) 0

We can also create an infinite list starting from 1. Then we "zip" the two lists together and take the last element (which is a pair) from the result:

myLength :: [a] -> Int
myLength1 xs = snd $ last $ zip xs [1..] -- Just for fun
myLength2 = snd . last . (flip zip [1..]) -- Because point-free is also fun
myLength3 = fst . last . zip [1..] -- same, but easier

We can also change each element into our list into a '1' and then add them all together.

myLength :: [a] -> Int
myLength = sum . map (\_->1)