main :: [sys_message] main = [Stdout (lay [showdate d ++ ": " ++ weekday d | d<-tests])] date ::= Date (num,num,num) showdate :: date->[char] showdate (Date (y,m,d)) = show m ++ "/" ++ show d ++ "/" ++ show y tests :: [date] tests = map Date [ (1800,1,6), (1875,3,29), (1915,12,7), (1970,12,23), (2043,5,14), (2077,2,12), (2101,4,2)] weekday :: date->[char] weekday (Date (year,month,day)) = weekdays ! daynum where weekdays = ["Sunday","Monday","Tuesday","Wednesday","Thursday", "Friday","Saturday"] doomtab = leapdoom, if leapyear = normdoom, otherwise leapdoom = [4,1,7,2,4,6,4,1,5,3,7,5] normdoom = [3,7,7,4,2,6,4,1,5,3,7,5] leapyear = year mod 4=0 & (year mod 100~=0 \/ year mod 400=0) (c, r) = (year div 100, year mod 100) (s, t) = (r div 12, r mod 12) c_anchor = (5 * (c mod 4) + 2) mod 7 doom = (s + t + t div 4 + c_anchor) mod 7 anchor = doomtab ! (month - 1) daynum = (doom + day - anchor + 7) mod 7