
Hi, see my comments below Am 24.08.2018 um 11:45 schrieb trent shipley:
I am mostly looking for style feedback, although if there are any obvious logic errors, I'd be "happy" to learn about those too.
[...] let me ignore the exercise text
type Bit = Int
A bit is not an Int! A user-defined type (or Bool) would be type safer (although arithmetic is missing).
byte :: Int byte = 8
parityByte :: Int parityByte = 9
bin2int :: [Bit] -> Int bin2int = foldr (\x y -> x + 2 * y) 0
use here "bit2int x" if bits are no ints.
-- Hutton, Graham. Programming in Haskell (Kindle Locations 2647-2649). Cambridge University Press. Kindle Edition.
int2bin :: Int -> [Bit] int2bin 0 = [] int2bin n = n `mod` 2 : int2bin (n `div` 2)
here you could use "even n" if bits are Bool.
-- Hutton, Graham. Programming in Haskell (Kindle Locations 2654-2656). Cambridge University Press. Kindle Edition.
make8 :: [Bit] -> [Bit] make8 bits = addParity (take byte (bits ++ repeat 0))
-- Parity functions
addParity :: [Bit] -> [Bit] addParity xs = if even (sum xs) then xs ++ [0] else xs ++ [1]
appending the parity (at the end of a list) is inefficient. The parity could be the first bit if it is not stored separately.
checkParity :: [Bit] -> Bool checkParity xs = (((even . sum) (take ((length xs) - 1) xs)) == ((even . last) xs)) || (((odd . sum) (take ((length xs) - 1) xs)) == ((odd . last) xs))
here is too much duplicate code! You could also use the function "init", if the input list xs is (checked to be) non-empty.
errorParity :: [Bit] -> ([Bit], Bool) errorParity xs = if checkParity xs then (xs, checkParity xs) else error "Parity error"
the result of this function is nonsense. The input (usually) does not need to be returned and the boolean result can only be true, since the other case fails with a runtime error.
dropParity :: [Bit] -> [Bit] dropParity xs = take ((length xs) - 1) xs
this function could have been reused in checkParity.
-- Hutton, Graham. Programming in Haskell (Kindle Locations 2662-2663). Cambridge University Press. Kindle Edition.
-- TRANSMISSION
encode :: String -> [Bit] encode = concat . map (make8 . int2bin . ord)
-- Hutton, Graham. Programming in Haskell (Kindle Locations 2673-2675). Cambridge University Press. Kindle Edition.
chop8 :: [Bit] -> [[Bit]] chop8 [] = [] chop8 bits = (dropParity . fst . errorParity) (take parityByte bits) : chop8 (drop parityByte bits)
use "splitAt" instead of take and drop. (It may not be very nice to fail with a runtime error by using errorParity.)
-- Hutton, Graham. Programming in Haskell (Kindle Locations 2681-2683). Cambridge University Press. Kindle Edition.
decode :: [Bit] -> String decode = map (chr . bin2int) . chop8
-- Hutton, Graham. Programming in Haskell (Kindle Locations 2686-2688). Cambridge University Press. Kindle Edition.
-- channel :: [Bit] -> [Bit] -- channel = id
channel :: [Bit] -> [Bit] channel = tail
"tail" is partial! This should be documented (if this is ok). Did you try to transmit an empty string? Cheers Christian
-- Hutton, Graham. Programming in Haskell (Kindle Locations 2696-2697). Cambridge University Press. Kindle Edition.
transmit :: String -> String transmit = decode . channel . encode
-- Hutton, Graham. Programming in Haskell (Kindle Locations 2694-2695). Cambridge University Press. Kindle Edition.
_______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners