<div dir="ltr">I think reduce takes two arguments: the growing seed and the current front.<div>You're trying to get (a[0]-b[0])^^2 + (a[1]-b[1])^^2 + ..., right?</div><div><br></div><div>Try this:</div><div><br></div><div>
<div><font face="arial, sans-serif"><span style="font-size:16px">module euclid;</span></font></div><div><font face="arial, sans-serif"><span style="font-size:16px"><br></span></font></div><div><font face="arial, sans-serif"><span style="font-size:16px"><br>
</span></font></div><div><font face="arial, sans-serif"><span style="font-size:16px">import std.stdio;</span></font></div><div><font face="arial, sans-serif"><span style="font-size:16px"><br></span></font></div><div><font face="arial, sans-serif"><span style="font-size:16px">double euclid_dist( double[] pt1, double[] pt2 ) {</span></font></div>
<div><font face="arial, sans-serif"><span style="font-size:16px">    assert( pt1.length == pt2.length );</span></font></div><div><font face="arial, sans-serif"><span style="font-size:16px">    import std.algorithm;</span></font></div>
<div><font face="arial, sans-serif"><span style="font-size:16px">    import std.math;</span></font></div><div><font face="arial, sans-serif"><span style="font-size:16px">    import std.range;</span></font></div><div><font face="arial, sans-serif"><span style="font-size:16px"><br>
</span></font></div><div><font face="arial, sans-serif"><span style="font-size:16px">    return sqrt(0.0.reduce!( (sum,pair) => sum + (pair[0]-pair[1])^^2 )(zip(pt1, pt2)));</span></font></div><div><font face="arial, sans-serif"><span style="font-size:16px">}</span></font></div>
<div><font face="arial, sans-serif"><span style="font-size:16px"><br></span></font></div><div><font face="arial, sans-serif"><span style="font-size:16px">void main()</span></font></div><div><font face="arial, sans-serif"><span style="font-size:16px">{</span></font></div>
<div><font face="arial, sans-serif"><span style="font-size:16px">    double[] arr1 = [0.0, 1.0, 0.1];</span></font></div><div><font face="arial, sans-serif"><span style="font-size:16px">    double[] arr2 = [1.0, -1.0, 0.0];</span></font></div>
<div><font face="arial, sans-serif"><span style="font-size:16px">    writeln(euclid_dist(arr1,arr2));</span></font></div><div><font face="arial, sans-serif"><span style="font-size:16px">}</span></font></div></div><div> </div>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Oct 31, 2013 at 8:12 PM, Craig Dillabaugh <span dir="ltr"><<a href="mailto:cdillaba@cg.scs.carleton.ca" target="_blank">cdillaba@cg.scs.carleton.ca</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I am trying to calculate the Euclidean Distance between two<br>
points. I currently have the following function (that doesn't<br>
compile):<br>
<br>
double euclid_dist( double[] pt1, double[] pt2 ) {<br>
   assert( pt1.length == pt2.length );<br>
<br>
   return sqrt(<br>
     zip(pt1, pt2).reduce!(function(e) { return<br>
(e[1]-e[0])*(e[1]-e[0]); })(0.0)<br>
   );<br>
}<br>
<br>
Hopefully it is clear what I am trying to do.  I want zip to<br>
create a range that is a tuple of the point's coordinate pairs,<br>
and then use reduce to sum the squared differences.  I get the<br>
following error but can't figure out how to fix my syntax:<br>
<br>
euclid.d(13): Error: template<br>
euclid.euclid_dist.reduce!(__<u></u>funcliteral2).reduce does not match<br>
any function template declaration. Candidates are:<br>
/usr/include/dmd/phobos/std/<u></u>algorithm.d(688):<br>
euclid.euclid_dist.reduce!(__<u></u>funcliteral2).reduce(Args...)(<u></u>Args<br>
args) if (Args.length > 0 && Args.length <= 2 &&<br>
isIterable!(Args[__dollar - 1]))<br>
euclid.d(13): Error: template<br>
euclid.euclid_dist.reduce!(__<u></u>funcliteral2).reduce(Args...)(<u></u>Args<br>
args) if (Args.length > 0 && Args.length <= 2 &&<br>
isIterable!(Args[__dollar - 1])) cannot deduce template function<br>
from argument types !()(Zip!(double[], double[]), double)<br>
Failed: 'dmd' '-v' '-o-' 'euclid.d' '-I.'<br>
<br>
<br>
I know I could use a simple foreach loop with my zip command, or<br>
even std.numeric.euclidean( ... ), but I am trying to be cute<br>
here!<br>
<br>
Cheers,<br>
Craig<br>
</blockquote></div><br></div>