Personal tools

99 questions/Solutions/4

From HaskellWiki

< 99 questions | Solutions(Difference between revisions)
Jump to: navigation, search
(Add description for each type of solution. Change formatting, ensure that all code is enclosed in "haskell" braces.)
m (Use headlines.)
 
Line 1: Line 1:
 
(*) Find the number of elements of a list.
 
(*) Find the number of elements of a list.
   
The simple, recursive solution.
+
== The simple, recursive solution ==
 
This is similar to the <hask>length</hask> from <hask>Prelude</hask>:
 
This is similar to the <hask>length</hask> from <hask>Prelude</hask>:
 
<haskell>
 
<haskell>
Line 10: Line 10:
 
The prelude for haskell 2010 can be found [http://www.haskell.org/onlinereport/haskell2010/haskellch9.html#x16-1710009 here.]
 
The prelude for haskell 2010 can be found [http://www.haskell.org/onlinereport/haskell2010/haskellch9.html#x16-1710009 here.]
   
Same, but now we use an "accumulator" argument.
+
== Same, but using an "accumulator" ==
 
<haskell>
 
<haskell>
 
myLength :: [a] -> Int
 
myLength :: [a] -> Int
Line 19: Line 19:
 
</haskell>
 
</haskell>
   
Using foldl/foldr:
+
== Using foldl/foldr ==
 
<haskell>
 
<haskell>
 
myLength :: [a] -> Int
 
myLength :: [a] -> Int
Line 30: Line 30:
 
</haskell>
 
</haskell>
   
  +
== Zipping with an infinite list ==
 
We can also create an infinite list starting from 1.
 
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:
 
Then we "zip" the two lists together and take the last element (which is a pair) from the result:
Line 39: Line 40:
 
</haskell>
 
</haskell>
   
We can also change each element into our list into a '1' and then add them all together.
+
== Mapping all elements to "1" ==
  +
We can also change each element into our list into a "1" and then add them all together.
 
<haskell>
 
<haskell>
 
myLength :: [a] -> Int
 
myLength :: [a] -> Int

Latest revision as of 13:21, 15 May 2014

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

Contents

[edit] 1 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.

[edit] 2 Same, but using an "accumulator"

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

[edit] 3 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

[edit] 4 Zipping with an infinite list

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

[edit] 5 Mapping all elements to "1"

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)