[Haskell-cafe] Trouble with indentation
Jules Bean
jules at jellybean.co.uk
Wed Jan 9 07:13:23 EST 2008
Fernando Rodriguez wrote:
>
> Hi,
>
> I'm trying to write a function that finds out the week day using the
> Zeller congruence (http://en.wikipedia.org/wiki/Zeller's_congruence).
>
> However, ghc complains about: parse error on input `=' at the "if m <= 2
> then " line. I believe this is some sort of layout error. Can someone
> point out what I am doing wrong?
>
> Here's the code:
>
> data DiaSemana = Lunes | Martes | Miercoles | Jueves | Viernes
> | Sabado | Domingo deriving (Show, Eq, Ord, Enum)
> diaDeSemana d m a = toEnum num :: DiaSemana
> where
> num = zeller x y z
> zeller x y z = (700 + (26 * x - 2) `div` 10
> + d + y + y `div` 4 + z `div` 4 - 2 * z)
> `mod` 7
> if m <= 2 then x = m
> + 10
> y = (a - 1) `mod` 100
> z = (a-1) 'div' 100
> else x = m - 2
> y = a `mod` 100
> z = a `div` 100
That looks like it's been mangled a bit by your mail program or mine,
but anyway:
This is not a layout problem. The problem here is simply that you can't
put "ifs" around chunks of definitions. "if" is an expression level
concept, not a definition-level one.
You could try:
diaDeSemana d m a = toEnum num :: DiaSemana
where
num = zeller x y z
zeller x y z = (700 + (26 * x - 2) `div` 10
+ d + y + y `div` 4 + z `div` 4 - 2 * z)
`mod` 7
x | m <= 2 = m + 10
| otherwise = m - 2
y | m <= 2 = (a - 1) `mod` 100
| otherwise = a `mod` 100
z | m <= 2 = (a-1) 'div' 100
| otherwise = a `div` 100
or, to avoid the ugly duplication of the m <= 2 constraint, we can use
an if in an expresson like this:
diaDeSemana d m a = toEnum num :: DiaSemana
where
num = zeller x y z
zeller x y z = (700 + (26 * x - 2) `div` 10
+ d + y + y `div` 4 + z `div` 4 - 2 * z)
`mod` 7
(x,y,z) = if m <=2 then
(m+10,(a-1)`mod`100,(a-1)`div`100)
else
(m-2,a`mod`100,a`div`100)
... or, replacing the if with guards again ...
diaDeSemana d m a = toEnum num :: DiaSemana
where
num = zeller x y z
zeller x y z = (700 + (26 * x - 2) `div` 10
+ d + y + y `div` 4 + z `div` 4 - 2 * z)
`mod` 7
(x,y,z)
| m <=2 = (m+10,(a-1)`mod`100,(a-1)`div`100)
| otherwise = (m-2 ,a `mod`100,a `div`100)
Jules
More information about the Haskell-Cafe
mailing list