Name: Anonymous 2007-03-23 13:13 ID:tyeGF24s
C#:
Perl:
Haskell:
public delegate T Function<T1, T>(T1 t1);
public delegate T Function<T1, T2, T>(T1 t1, T2 t2);
static IEnumerable<T> Map<T>(IEnumerable<T> v1, IEnumerable<T> v2, Function<T, T, T> proc) {
using (IEnumerator<T> e1 = v1.GetEnumerator())
using (IEnumerable<T> e2 = v2.GetEnumerator())
while (e1.MoveNext() && e2.MoveNext())
yield return proc(e1.Current, e2.Current);
}
static T Reduce<T1, T>(IEnumerable<T1> v, Function<T, T1, T> proc) {
T result = default(T);
foreach (T1 item in v)
result = proc(result, item);
return result;
}
which would allow you to write the dot product function like this:
static double DotProduct(IEnumerable<double> v1, IEnumerable<double> v2) {
return Reduce(
Map(v1, v2, delegate(double d1, double d2) { return d1 * d2; }),
delegate (double sum, double item) { return sum + item; }
);
}Perl:
sub dot($a,$b) {
$sum += $a[$_] * $b[$_] for 0 .. @a-1;
}Haskell:
dot = (sum .) . zipWith (*)