<div dir="ltr"><div>My attempt not only compiled, but seems to run OK.  (Really, a just gave it a couple of trivial tests, and said good enough.  I didn't really mess with corner cases like empty lists.  It was late, and I didn't want to tempt fate.)</div><div><br></div><div>THUS,</div><div><br></div><div>I am mostly looking for style feedback, although if there are any obvious logic errors, I'd be "happy" to learn about those too.</div><div><br></div><div><font face="monospace">{--</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">7. Modify the binary string transmitter example to detect simple transmission errors using the concept of parity bits. That is, each eight-bit binary number produced during encoding is extended with a parity bit, set to one if the number contains an odd number of ones, and to zero otherwise. In turn, each resulting nine-bit binary number consumed during decoding is checked to ensure that its parity bit is correct, with the parity bit being discarded if this is the case, and a parity error being reported otherwise. Hint: the library function error :: String -> a displays the given string as an error message and terminates the program; the polymorphic result type ensures that error can be used in any context. </font></div><div><font face="monospace"><br></font></div><div><font face="monospace">8. Test your new string transmitter program from the previous exercise using a faulty communication channel that forgets the first bit, which can be modelled using the tail function on lists of bits.</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">Hutton, Graham. Programming in Haskell (Kindle Locations 2842-2851). Cambridge University Press. Kindle Edition. </font></div><div><font face="monospace"><br></font></div><div><font face="monospace">--}</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">import Data.Char</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">type Bit = Int</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">byte :: Int</font></div><div><font face="monospace">byte = 8</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">parityByte :: Int</font></div><div><font face="monospace">parityByte = 9</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">bin2int :: [Bit] -> Int </font></div><div><font face="monospace">bin2int = foldr (\x y -> x + 2 * y) 0</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">-- Hutton, Graham. Programming in Haskell (Kindle Locations 2647-2649). Cambridge University Press. Kindle Edition. </font></div><div><font face="monospace"><br></font></div><div><font face="monospace">int2bin :: Int -> [Bit] </font></div><div><font face="monospace">int2bin 0 = [] </font></div><div><font face="monospace">int2bin n = n `mod` 2 : int2bin (n `div` 2)</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">-- Hutton, Graham. Programming in Haskell (Kindle Locations 2654-2656). Cambridge University Press. Kindle Edition. </font></div><div><font face="monospace"><br></font></div><div><font face="monospace">make8 :: [Bit] -> [Bit] </font></div><div><font face="monospace">make8 bits = addParity (take byte (bits ++ repeat 0))</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">-- Parity functions</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">addParity :: [Bit] -> [Bit]</font></div><div><font face="monospace">addParity xs = if even (sum xs) </font></div><div><font face="monospace">               then xs ++ [0]</font></div><div><font face="monospace">               else xs ++ [1]</font></div><div><font face="monospace">               </font></div><div><font face="monospace">checkParity :: [Bit] -> Bool</font></div><div><font face="monospace">checkParity xs = (((even . sum) (take ((length xs) - 1) xs)) == </font></div><div><font face="monospace">                     ((even . last) xs)) ||   </font></div><div><font face="monospace">                 (((odd  . sum) (take ((length xs) - 1) xs)) == </font></div><div><font face="monospace">                     ((odd  . last) xs))</font></div><div><font face="monospace">                 </font></div><div><font face="monospace">errorParity :: [Bit] -> ([Bit], Bool)</font></div><div><font face="monospace">errorParity xs = if checkParity xs </font></div><div><font face="monospace">                 then (xs, checkParity xs) </font></div><div><font face="monospace">                 else error "Parity error"</font></div><div><font face="monospace">                 </font></div><div><font face="monospace">dropParity :: [Bit] -> [Bit]</font></div><div><font face="monospace">dropParity xs = take ((length xs) - 1) xs</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">-- Hutton, Graham. Programming in Haskell (Kindle Locations 2662-2663). Cambridge University Press. Kindle Edition.</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">-- TRANSMISSION</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">encode :: String -> [Bit] </font></div><div><font face="monospace">encode = concat . map (make8 . int2bin . ord)</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">-- Hutton, Graham. Programming in Haskell (Kindle Locations 2673-2675). Cambridge University Press. Kindle Edition. </font></div><div><font face="monospace"><br></font></div><div><font face="monospace">chop8 :: [Bit] -> [[Bit]] </font></div><div><font face="monospace">chop8 [] = [] </font></div><div><font face="monospace">chop8 bits = (dropParity . fst . errorParity) (take parityByte bits) : </font></div><div><font face="monospace">                 chop8 (drop parityByte bits)</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">-- Hutton, Graham. Programming in Haskell (Kindle Locations 2681-2683). Cambridge University Press. Kindle Edition. </font></div><div><font face="monospace"><br></font></div><div><font face="monospace">decode :: [Bit] -> String </font></div><div><font face="monospace">decode = map (chr . bin2int) . chop8</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">-- Hutton, Graham. Programming in Haskell (Kindle Locations 2686-2688). Cambridge University Press. Kindle Edition. </font></div><div><font face="monospace"><br></font></div><div><font face="monospace">-- channel :: [Bit] -> [Bit] </font></div><div><font face="monospace">-- channel = id</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">channel :: [Bit] -> [Bit] </font></div><div><font face="monospace">channel = tail</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">-- Hutton, Graham. Programming in Haskell (Kindle Locations 2696-2697). Cambridge University Press. Kindle Edition. </font></div><div><font face="monospace"><br></font></div><div><font face="monospace">transmit :: String -> String </font></div><div><font face="monospace">transmit = decode . channel . encode</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">-- Hutton, Graham. Programming in Haskell (Kindle Locations 2694-2695). Cambridge University Press. Kindle Edition. </font></div></div>