principle of least surprise

Martin Bjorklund <>
Wed Nov 23 08:49:12 CET 2005


"Richard A. O'Keefe" <> wrote:
> What exactly is WRONG with 'andalso' (= Dijkstra's 'cand', C's '&&',
> Haskell's '&&', ISO Pascal's 'and_then', Ada's 'and then', SML's
> 'andalso') and 'orelse' (= Dijkstra's 'cor', C's '||', Haskell's '||',
> ISO Pascal's 'or_else', Ada's 'or else', SML's 'orelse')?

What't the point of having two different (three if you count ; and ,)
ways of saying and/or?   You've already given the answer:

> >60 years of programming languages have shown us that it is a bad idea
> or use plain 'and' and 'or', because people are never quite sure what
> they do.

What can I say...  

> But the real problem, it seems to me, is that someone is trying to
> do something very very odd.
> 
> Having a type that is either an atom or a pair?  Fine, no problems.
> It's easy enough to write functions
> 
>     f({X,Y}) -> ...;
>     f(X) when atom(X) -> ... .

This isn't really useful if I have more than just a few functions
operating on this type - I would have to do 

 f({X,Y}) ->  ... g({X,Y}) ,...
 f(X) when is_atom(X) ->  ... g(X) ,...

or

 f({X,Y}) ->  safe_f({X,Y});
 f(X) when is_atom(X) ->  safe_f(X).

safe_f(X) -> ... g(X).

for all functions.


> But having a function where the argument could be that OR something else?
> Not so fine.  Not fine at all, really.  A function argument should have one
> clear conceptual type.  The language is trying to tell you you are doing
> something that could be better done other ways.

I'm just trying to do some abstraction with the tools we have today
(well it didn't work...) - exactly what you say.

> Do I have to mention that abstract patterns could have solved the original
> problem with ease?  Maybe I do.

But you just said that what i tried to achieve was odd.  With your
abstract patterns I'm suddenly allowed to think in these odd ways?



/martin



More information about the erlang-questions mailing list