<div dir="ltr"><div>Pankaj Godbole's code examples for 8.9.6 are sufficiently more complex than mine,that I am worried I missed an obvious bug I'm not experience enough to know about or test for.<br></div><div><br></div><div>Correction or reassurances would be appreciated. </div><div><br></div><div>Regards,</div><div><br></div><div>Trent</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">5. Given the type declaration</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">data Expr = Val Int | Add Expr Expr</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">define a higher-order function</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">folde :: (Int -> a) -> (a -> a -> a) -> Expr -> a</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">such that folde f g replaces each Val constructor in an expression by the function f, and each Add constructor by the function g.</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">Hutton, Graham. Programming in Haskell (Kindle Locations 3364-3371). 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">data Expr = Val Int | Add Expr Expr</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">-- Trent's stuff</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">folde :: (Int -> a) -> (a -> a -> a) -> Expr -> a</font></div><div><font face="monospace">folde f g (Val x) = f x</font></div><div><font face="monospace">folde f g (Add left right) = g (folde f g left) (folde f g right)</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">6. Using folde, define a function</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">eval :: Expr -> Int</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">that evaluates an expression to an integer value, and a function</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">size :: Expr -> Int</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">that calculates the number of values in an expression.</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">Hutton, Graham. Programming in Haskell (Kindle Locations 3372-3374). 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">-- Trent's stuff</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">eval :: Expr -> Int</font></div><div><font face="monospace">eval = folde id (+)</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">size :: Expr -> Int</font></div><div><font face="monospace">size = folde (\_ -> 1) (+) -- hlint suggests \_ as const 1</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">test0 :: Expr</font></div><div><font face="monospace">test0 = Val 1</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">test1 :: Expr</font></div><div><font face="monospace">test1 = Add (Val 1) (Val 2)</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">test3 :: Expr</font></div><div><font face="monospace">test3 = Add (Val 1) (Add (Val 2) (Val 3))</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">-- the below are from:</font></div><div><font face="monospace">-- </font><font color="#24292e" face="monospace">Pankaj Godbole</font></div><div><font face="monospace">-- <a href="https://github.com/pankajgodbole/hutton/blob/master/exercises.hs">https://github.com/pankajgodbole/hutton/blob/master/exercises.hs</a></font></div><div><font face="monospace"><br></font></div><div><font face="monospace">evalE             :: Expr -> Int</font></div><div><font face="monospace">evalE (Val n)     =  n</font></div><div><font face="monospace">evalE (Add e1 e2) =  folde toEnum (+) (Add e1 e2)</font></div><div><font face="monospace">-- doesn't a Val have to prefix an int?  Then why is f "toEnum"?</font></div><div><font face="monospace"><br></font></div><div><font face="monospace"><br></font></div><div><font face="monospace">numVals             :: Expr -> Int</font></div><div><font face="monospace">numVals (Val n)     =  1</font></div><div><font face="monospace">numVals (Add e1 e2) =  numVals e1 + numVals e2  </font></div></div>