<div dir="ltr">Your answers are good.  toEnum is redundant.  Reconstructing the Add is unnecessary.  His second function is fine but it doesn't use folde.<div><br></div><div>I would take hlint's suggestion and use const.  This situation is a common use case.</div></div><br><div class="gmail_quote"><div dir="ltr">On Fri, Sep 14, 2018 at 4:04 AM trent shipley <<a href="mailto:trent.shipley@gmail.com">trent.shipley@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><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" target="_blank">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>
_______________________________________________<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>
</blockquote></div>