<div dir="ltr"><div><div><div>Hello everybody,<br><br></div><div>I do not have many experience with haskell, but I'm programming for more then 10 years<br>and I'm spending almost all my free time to learn FP during last 1.5 years.<br><br></div>I have read book being discussed (Graham Hutton) and I would like to say just a couple words about it.<br><br></div>First of all you need remember that it is book for beginners, so, IMO author would prefer<br>to use "possible easy to understand" way instead of "most type safe" or "most canonical".<br></div><div>And this is good for beginners because otherwise details take too many time with<br></div><div>unreasanable low results.<br><br></div><div>Hutton's style is very understandable. No even one needless detail over all the book.<br>Code looks to me simple, concise and very clean. Despite it looks not safe<br>sometimes, it is always perfectly reasonable. I want to say I would be happy<br></div><div>if I were to write such code in production.<br></div><div><br></div><div>When one has his own experience in haskell, she or he will be able to choose his own style.<br></div><div>But for beginners I would surely recommend to follow Hutton's style.<br><br></div><div>wbr,<br></div><div>Andrey<br></div></div><br><div class="gmail_quote"><div dir="ltr">пн, 27 авг. 2018 г. в 15:41, <<a href="mailto:beginners-request@haskell.org">beginners-request@haskell.org</a>>:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Send Beginners mailing list submissions to<br>
        <a href="mailto:beginners@haskell.org" target="_blank">beginners@haskell.org</a><br>
<br>
To subscribe or unsubscribe via the World Wide Web, visit<br>
        <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
or, via email, send a message with subject or body 'help' to<br>
        <a href="mailto:beginners-request@haskell.org" target="_blank">beginners-request@haskell.org</a><br>
<br>
You can reach the person managing the list at<br>
        <a href="mailto:beginners-owner@haskell.org" target="_blank">beginners-owner@haskell.org</a><br>
<br>
When replying, please edit your Subject line so it is more specific<br>
than "Re: Contents of Beginners digest..."<br>
<br>
<br>
Today's Topics:<br>
<br>
   1. Re:  Hutton ex 7.7 and 7.8 (C Maeder)<br>
<br>
<br>
----------------------------------------------------------------------<br>
<br>
Message: 1<br>
Date: Mon, 27 Aug 2018 10:02:48 +0200<br>
From: C Maeder <<a href="mailto:chr.maeder@web.de" target="_blank">chr.maeder@web.de</a>><br>
To: <a href="mailto:fa-ml@ariis.it" target="_blank">fa-ml@ariis.it</a><br>
Cc: The Haskell-Beginners Mailing List - Discussion of primarily<br>
        beginner-level topics related to Haskell <<a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a>><br>
Subject: Re: [Haskell-beginners] Hutton ex 7.7 and 7.8<br>
Message-ID: <<a href="mailto:7c43aeb1-80ea-5bc5-e683-002cfeeea796@web.de" target="_blank">7c43aeb1-80ea-5bc5-e683-002cfeeea796@web.de</a>><br>
Content-Type: text/plain; charset=utf-8<br>
<br>
Hi, see my comments below<br>
<br>
Am 24.08.2018 um 11:45 schrieb trent shipley:<br>
> <br>
> I am mostly looking for style feedback, although if there are any<br>
> obvious logic errors, I'd be "happy" to learn about those too.<br>
<br>
[...] let me ignore the exercise text<br>
<br>
> <br>
> type Bit = Int<br>
<br>
A bit is not an Int! A user-defined type (or Bool) would be type safer<br>
(although arithmetic is missing).<br>
<br>
> <br>
> byte :: Int<br>
> byte = 8<br>
> <br>
> parityByte :: Int<br>
> parityByte = 9<br>
> <br>
> bin2int :: [Bit] -> Int <br>
> bin2int = foldr (\x y -> x + 2 * y) 0<br>
<br>
use here "bit2int x" if bits are no ints.<br>
<br>
> <br>
> -- Hutton, Graham. Programming in Haskell (Kindle Locations 2647-2649).<br>
> Cambridge University Press. Kindle Edition. <br>
> <br>
> int2bin :: Int -> [Bit] <br>
> int2bin 0 = [] <br>
> int2bin n = n `mod` 2 : int2bin (n `div` 2)<br>
<br>
here you could use "even n" if bits are Bool.<br>
<br>
> <br>
> -- Hutton, Graham. Programming in Haskell (Kindle Locations 2654-2656).<br>
> Cambridge University Press. Kindle Edition. <br>
> <br>
> make8 :: [Bit] -> [Bit] <br>
> make8 bits = addParity (take byte (bits ++ repeat 0))<br>
> <br>
> -- Parity functions<br>
> <br>
> addParity :: [Bit] -> [Bit]<br>
> addParity xs = if even (sum xs) <br>
>                then xs ++ [0]<br>
>                else xs ++ [1]<br>
<br>
appending the parity (at the end of a list) is inefficient. The parity<br>
could be the first bit if it is not stored separately.<br>
<br>
>                <br>
> checkParity :: [Bit] -> Bool<br>
> checkParity xs = (((even . sum) (take ((length xs) - 1) xs)) == <br>
>                      ((even . last) xs)) ||   <br>
>                  (((odd  . sum) (take ((length xs) - 1) xs)) == <br>
>                      ((odd  . last) xs))<br>
<br>
here is too much duplicate code! You could also use the function "init",<br>
if the input list xs is (checked to be) non-empty.<br>
<br>
>                  <br>
> errorParity :: [Bit] -> ([Bit], Bool)<br>
> errorParity xs = if checkParity xs <br>
>                  then (xs, checkParity xs) <br>
>                  else error "Parity error"<br>
<br>
the result of this function is nonsense. The input (usually) does not<br>
need to be returned and the boolean result can only be true, since the<br>
other case fails with a runtime error.<br>
<br>
>                  <br>
> dropParity :: [Bit] -> [Bit]<br>
> dropParity xs = take ((length xs) - 1) xs<br>
<br>
this function could have been reused in checkParity.<br>
<br>
> <br>
> -- Hutton, Graham. Programming in Haskell (Kindle Locations 2662-2663).<br>
> Cambridge University Press. Kindle Edition.<br>
> <br>
> -- TRANSMISSION<br>
> <br>
> encode :: String -> [Bit] <br>
> encode = concat . map (make8 . int2bin . ord)<br>
> <br>
> -- Hutton, Graham. Programming in Haskell (Kindle Locations 2673-2675).<br>
> Cambridge University Press. Kindle Edition. <br>
> <br>
> chop8 :: [Bit] -> [[Bit]] <br>
> chop8 [] = [] <br>
> chop8 bits = (dropParity . fst . errorParity) (take parityByte bits) : <br>
>                  chop8 (drop parityByte bits)<br>
<br>
use "splitAt" instead of take and drop. (It may not be very nice to fail<br>
with a runtime error by using errorParity.)<br>
<br>
> <br>
> -- Hutton, Graham. Programming in Haskell (Kindle Locations 2681-2683).<br>
> Cambridge University Press. Kindle Edition. <br>
> <br>
> decode :: [Bit] -> String <br>
> decode = map (chr . bin2int) . chop8<br>
> <br>
> -- Hutton, Graham. Programming in Haskell (Kindle Locations 2686-2688).<br>
> Cambridge University Press. Kindle Edition. <br>
> <br>
> -- channel :: [Bit] -> [Bit] <br>
> -- channel = id<br>
> <br>
> channel :: [Bit] -> [Bit] <br>
> channel = tail<br>
<br>
"tail" is partial! This should be documented (if this is ok). Did you<br>
try to transmit an empty string?<br>
<br>
Cheers Christian<br>
<br>
> <br>
> -- Hutton, Graham. Programming in Haskell (Kindle Locations 2696-2697).<br>
> Cambridge University Press. Kindle Edition. <br>
> <br>
> transmit :: String -> String <br>
> transmit = decode . channel . encode<br>
> <br>
> -- Hutton, Graham. Programming in Haskell (Kindle Locations 2694-2695).<br>
> Cambridge University Press. Kindle Edition. <br>
> <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" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
> <br>
<br>
<br>
<br>
------------------------------<br>
<br>
Subject: Digest Footer<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" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
<br>
<br>
------------------------------<br>
<br>
End of Beginners Digest, Vol 122, Issue 19<br>
******************************************<br>
</blockquote></div>