
I am learning haskell (and functional programming), from the School of Expression book. There's an exercise to rewrite the following function (for computing the area of a polygon) using map, fold, etc: data Shape = Polygon [Vertex] area (Polygon (v1:vs)) = polyArea vs where polyArea :: [Vertex] -> Float polyArea (v2:v3:vs') = triArea v1 v2 v3 + polyArea (v3:vs') polyArea _ = 0 My first thought is to use fold here, since this function accumulates a result as it traverses the list. But fold consumes one element of the list at a time, while area needs to examine the first three elements of the list, and consume two of them at a time. Is there a more general alternative to fold? Or is there some trick I'm missing here? Thanks, Nathan