I've just started to learn Haskell and I was told that Haskell is lazy, i.e. it does as little work as possible in evaluating expressions, but I don't think that's true.

Consider this:

```
und :: Bool -> Bool -> Bool
und False y = False
und y False = False

non_term x = non_term (x+1)

```

The evaluation of `und (non_term 1) False` never terminates, but it's clear that the result if False.

Is there a way to implement `und` (i.e. `and` in German) *correctly* (not just partially as above) so that both

```
und (non_term 1) False

```

and

```
und False (non_term 1)

```

return False?