<div dir="ltr">Hi Roelof,<div><br></div><div>If you don't consider it cheating (and I suggest you shouldn't, having had a stab at the answers), you will find great enlightenment looking at how these functions are *actually* implemented in the wild.  Did you know that there is a "source" link for each function on Hackage?  By clicking on that, for your first example, you can compare the actual implementation of (++) with your "plusplus" function:</div><div><br></div><div><a href="http://hackage.haskell.org/package/base-4.8.0.0/docs/src/GHC-Base.html#%2B%2B">http://hackage.haskell.org/package/base-4.8.0.0/docs/src/GHC-Base.html#%2B%2B</a><br></div><div><br></div><div>(By the way, it's that function in particular that gave me one of my first "Aha!" moments in Haskell... it's quite beautiful in its simplicity).</div><div><br></div><div>One thing with viewing the source on Hackage is that sometimes it can be a little more confusing than it needs to be for the sake of efficiency.  A really good source for good, readable examples of Prelude functions in Haskell is the Haskell Report:</div><div><br></div><div><a href="https://www.haskell.org/onlinereport/standard-prelude.html">https://www.haskell.org/onlinereport/standard-prelude.html</a></div><div><br></div><div>(In this case, though, the implementation is the same).</div><div><br></div><div>Having a shot at defining these library functions yourself, as you have done, and then comparing your version with the "official" version in the prelude is a great way to learn good style!</div><div><br></div><div>-Dani. </div></div><div class="gmail_extra"><br><div class="gmail_quote">2015-05-13 15:10 GMT+09:00 Roelof Wobben <span dir="ltr"><<a href="mailto:r.wobben@home.nl" target="_blank">r.wobben@home.nl</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello,<br>
<br>
For practising pattern matching and recursion I did recreate some commands of Data,list.<br>
<br>
My re-implementation of ++ :<br>
<br>
plusplus :: [a] -> [a] -> [a]<br>
plusplus [] [] = [] ;<br>
plusplus [] (xs) = xs<br>
plusplus (xs) [] = xs<br>
plusplus (xs) yx = plusplus' (reverse xs) yx<br>
<br>
plusplus' :: [a] -> [a] -> [a]<br>
plusplus' [] (xs) = xs<br>
plusplus' (x:xs) yx = plusplus' xs (x:yx)<br>
<br>
main = print $ plusplus ["a","b"] ["c","d"]<br>
<br>
my re-implementation of init :<br>
<br>
import Data.Maybe<br>
<br>
-- | The main entry point.<br>
init' :: [a] -> Maybe [a]<br>
init' [] = Nothing<br>
init' [x] = Just []<br>
init' (x:xs) = Just (x:fromMaybe xs (init' xs))<br>
<br>
main = print . init' $ [1,3]<br>
<br>
<br>
my re-implementation of last :<br>
<br>
-- | The main entry point.<br>
last' :: [a] -> Maybe a<br>
last' [] = Nothing<br>
last' [x] = Just x<br>
last' (_:xs) = last' xs<br>
<br>
main = print . last' $ []<br>
<br>
Now I wonder if these solutions are the haskell way ? if not so, how can I improve them ,<br>
<br>
Roelof<br>
<br>
<br>
---<br>
Dit e-mailbericht is gecontroleerd op virussen met Avast antivirussoftware.<br>
<a href="http://www.avast.com" target="_blank">http://www.avast.com</a><br>
<br>
_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
</blockquote></div><br></div>