# [erlang-questions] Bug ?!

Richard A. O'Keefe <>
Wed Oct 4 02:38:07 CEST 2006

```Richard Carlsson <> reminds me of something:
Compare:
X * 4711
length(Stuff)
R#r.a
and
[X|Y]
{foo, X}
"abc" ++ Xs

Ever since I met them, I have *loved* n+k patterns in Haskell.

For example, if I want to define factorial, I can do

factorial 0 = 1
factorial n@(m+1) = n * factorial m

The semantics I want for this is

<pattern> + <constant> matches <value>

if  (1) <value> >= <constant>
and (2) <pattern> matches <value> - <constant>
(Compile-time check: <constant> is a strictly positive integer)

I would really like to be able to write

factorial(0) -> 1;
factorial(N = (M+1)) -> N * factorial(M).

in Erlang.  Note that the semantics I have defined for this makes
this SAFER than

factorial(0) -> 1;
factorial(N) -> N * factorial(N-1).

But also, when working with binary, ternary, and quaternary trees,
I have wanted to do this:

f(1) -> ...;
f(2*K+0) -> ...;
f(2*K+1) -> ....

where the semantics is

<multiplier> * <pattern> + <constant> matches <value>

if  (1) <value> >= <constant>
and (2) (<value> - <constant>) mod <multiplier> = 0
and (3) <pattern> matches (<value> - <constant>) div <multiplier>
(Compile-time check: <constant> >= 0 and <multiplier> > 1, both integers.)

The special case of 2*_+_ can of course be done with bit tests and shifts.

This would certainly conflict with the use of function calls in patterns.

```