<div dir="ltr"><div class="gmail_default" style="font-family:monospace,monospace">The definition</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">last [] = []</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">was a bad move.  Warnings about unhandled alternatives</div><div class="gmail_default" style="font-family:monospace,monospace">are only that, WARNINGS.  Something like this is quite</div><div class="gmail_default" style="font-family:monospace,monospace">definitely wrong.  We want</div><div class="gmail_default" style="font-family:monospace,monospace">  last [1,2,3] ===> 3</div><div class="gmail_default" style="font-family:monospace,monospace">but last [] = [] says that last can only return lists.</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">It's OK to say "this is not defined".</div><div class="gmail_default" style="font-family:monospace,monospace">It's OK to say "this is an error case".</div><div class="gmail_default" style="font-family:monospace,monospace">It's not OK to make stuff up that does not fit.</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">last [] = undefined</div><div class="gmail_default" style="font-family:monospace,monospace">last (x:xs) = last' x xs</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">or</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">last [] = error "last []"</div><div class="gmail_default" style="font-family:monospace,monospace">last (x:xs) = last' x xs</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">let you assure the compiler (and your readers)</div><div class="gmail_default" style="font-family:monospace,monospace">that you *have* considered this case; you didn't</div><div class="gmail_default" style="font-family:monospace,monospace">just forget about it.  They also do not constrain</div><div class="gmail_default" style="font-family:monospace,monospace">the result type in any way, so they don't<br></div><div class="gmail_default" style="font-family:monospace,monospace">interfere with the rest of the definition.</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div style="font-family:monospace,monospace" class="gmail_default">The meaning of last' x xs is</div><div style="font-family:monospace,monospace" class="gmail_default">"last' x xs is the last element of [x]++xs"</div><div style="font-family:monospace,monospace" class="gmail_default">and you can figure that out for yourself with a</div><div style="font-family:monospace,monospace" class="gmail_default">simple case analysis on xs.</div><div><br></div><div><div style="font-family:monospace,monospace" class="gmail_default">A hint on reading exercises in functional programming books:</div><div style="font-family:monospace,monospace" class="gmail_default">"make a function F that ..." almost NEVER means</div><div style="font-family:monospace,monospace" class="gmail_default">"make a function F that ... without even thinking about</div><div style="font-family:monospace,monospace" class="gmail_default">introducing any helper functions."  When defining last,</div><div style="font-family:monospace,monospace" class="gmail_default">introducing last' is OK.  You can make it local if you want:</div><div style="font-family:monospace,monospace" class="gmail_default"><br></div><div style="font-family:monospace,monospace" class="gmail_default">last (x:xs) = last' x xs</div><div style="font-family:monospace,monospace" class="gmail_default">  where last' x (y:ys) = ...</div><div style="font-family:monospace,monospace" class="gmail_default">        last' x []     = ...</div><div style="font-family:monospace,monospace" class="gmail_default">last [] = error "last []"</div><div style="font-family:monospace,monospace" class="gmail_default"><br></div><div style="font-family:monospace,monospace" class="gmail_default">although you don't need to.  <br></div><br></div></div>