<table cellspacing="0" cellpadding="0" border="0" ><tr><td valign="top" style="font: inherit;">Here's an (Fortran) algorithm for calculating an area, given&nbsp; one dimensional<br>arrays of Xs and Ys. I wrote a recursive Haskell function that works, and one using<br>FOLDL that doesn't. Why would Haskell be "expecting" (t, t) out of ((*) (xold-x) (yold+y))?<br><br>Michael<br><br>====================<br><br>&nbsp;&nbsp; AREA = 0.0<br>&nbsp;&nbsp; XOLD = XVERT(NVERT)<br>&nbsp;&nbsp; YOLD = YVERT(NVERT)<br>&nbsp;&nbsp; DO 10 N = 1, NVERT<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X = XVERT(N)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Y = YVERT(N)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AREA = AREA + (XOLD - X)*(YOLD + Y)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XOLD = X<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; YOLD = Y<br>10
CONTINUE<br><br>&nbsp;&nbsp; AREA = 0.5*AREA<br><br>====================<br><br>area :: [(Double,Double)] -&gt; Double<br>area ps = abs \$ (/2) \$ area' (last ps) ps<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where area' _ [] = 0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; area' (x0,y0) ((x,y):ps) = (x0-x)*(y0+y) + area' (x,y) ps<br><br><br><br>*Main&gt; let p = [(0.0,0.0),(1.0,0.0),(1.0,1.0),(0.0,1.0),(0.0,0.0)]<br>*Main&gt; area (last p) p<br>1.0<br>*Main&gt; <br><br>====================<br><br>area :: [(Double,Double)] -&gt; Double<br>area p = foldl (\ (xold,yold) (x,y) -&gt; ((*) (xold-x) (yold+y))) 0 ((last p):p)<br><br><br>Prelude&gt; :l area<br>[1 of 1] Compiling Main&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( area.hs, interpreted )<br><br>area.hs:29:40:<br>&nbsp;&nbsp;&nbsp; Occurs check: cannot construct the infinite type: t =
(t, t)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Expected type: (t, t)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Inferred type: t<br>&nbsp;&nbsp;&nbsp; In the expression: ((*) (xold - x) (yold + y))<br>&nbsp;&nbsp;&nbsp; In the first argument of `foldl', namely<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; `(\ (xold, yold) (x, y) -&gt; ((*) (xold - x) (yold + y)))'<br>Failed, modules loaded: none.<br>Prelude&gt; <br><br></td></tr></table><br>