# [Haskell-beginners] print all days of calendar

Daniel Fischer daniel.is.fischer at web.de
Mon Dec 21 16:00:58 EST 2009

```Am Montag 21 Dezember 2009 21:39:38 schrieb kane96 at gmx.de:
> -------- Original-Nachricht --------
>
> > Datum: Mon, 21 Dec 2009 21:12:48 +0100
> > Von: Daniel Fischer <daniel.is.fischer at web.de>
> > An: beginners at haskell.org
> > CC: kane96 at gmx.de
> > Betreff: Re: [Haskell-beginners] print all days of calendar
> >
> > Am Montag 21 Dezember 2009 20:47:38 schrieb kane96 at gmx.de:
> > > > Does (==) ring a few bells?
> > >
> > > not really...
> >
> > Prelude> let okay k = k^3 `mod` 13 == 5 in filter okay [1 .. 30]
> > [7,8,11,20,21,24]
> >
> > Now, you don't want the numbers between 1 and 30 inclusive whose cube
> > modulo 13 is 5, but
> > the dates in a given month.
> >
> > getMonth :: Month -> Calendar -> Calendar
> > getMonth month [(1,Jan,y),(2,Jan,y) ... (31,Dec,y)]
>
> more like this:
> getMonth month calendar = calendar filter ([1..31], month, year)
> but it doesn't make sense

No.
type Calendar = [Date]
type Day = Int
data Month = Jan | Feb | Mar | Apr | May | Jun | Jul | Ago | Sep | Oct | Nov | Dec
deriving (Eq,Enum,Show)
type Year = Int
type Date = (Day,Month,Year)

So the calendar in "getMonth month calendar" is a list of date-triples as illustrated
above.

Prelude> :t filter
filter :: (a -> Bool) -> [a] -> [a]

So filter takes
1) a predicate (a function of type (a -> Bool))
2) a list
as arguments.

getMonth :: Month -> [Date] -> [Date]

One of the arguments to getMonth is a list, and the result should be a list of the same
type, thus it's natural to pass that list unchanged to filter.

getMonth month calendar = filter predicateThatYouNeed calendar

What remains is to define predicateThatYouNeed. It will somehow involve the other argument
to getMonth, namely month. And it must map (Day,Month,Year) triples to Bool.
```