[erlang-questions] "Symmetrical" function
Richard O'Keefe
<>
Tue Feb 17 05:05:10 CET 2009
On 17 Feb 2009, at 11:56 am, Michael Radford wrote:
> (The original poster was rather emphatic: "I have a function f(A,B)
> for
> which f(A,B) is ALWAYS equivalent to f(B,A)".)
That is, the *abstract* function he wanted to implement is symmetric,
but he wanted to know how to halve the work of writing it.
> Actually, that assumption was unnecessary.
Whether that is so depends on how the function is to be implemented.
As several people pointed out, sometimes the answer is
f(X, Y) when X =< Y -> f1(X, Y);
f(X, Y) -> f1(Y, X).
If the f1 clauses are a mix of choices from both sides of the
main diagonal of the matrix, that won't work.
Some obvious questions are "for the intended symmetric f : A x A -> B,
what is #A? And how many clauses would you have for the implemented
f without using any trickery? Why do you think it is feasible to
write half of the function?"
Let's take the intersection of two sorted lists as an example
of a symmetric function:
oi([X|Xs], [Y|Ys]) ->
if X < Y -> oi(Xs, [Y|Ys])
; X > Y -> oi([X|Xs], Ys)
; true -> oi(Xs, Ys)
end;
oi(_, _) ->
[].
Here #A is infinite, the number of clauses is 2, and I don't see
any good way to write half of f.
More information about the erlang-questions
mailing list