<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div></div><div>With transpose, you get a pattern match failure if you try to transpose an empty list, and with transpose2 you get an infinite list (of empty lists). Those are in a sense two ways of representing failure, if you take an empty list to not be a valid matrix.</div><div><br></div><div>But the second definition “works” because zip (or zipWith) of two lists stops when either list runs out (so you can zip an infinite list with a finite one to get a finite result).</div><div><br></div><div>I guess the point is to observe that the “<span style="background-color: rgba(255, 255, 255, 0);">transpose [xs]” case is just a specialization of the “transpose (xs:xss)” if you choose “transpose []” carefully. I’m not sure if that’s deeply significant, though it’s a good thing to watch for (special cases that don’t need to be separate cases). In this situation it does make the failure case exotic though.</span></div><div><span style="background-color: rgba(255, 255, 255, 0);"><br></span></div><div><span style="background-color: rgba(255, 255, 255, 0);">Jeff</span></div><div><br>On Apr 23, 2021, at 9:31 AM, Galaxy Being <<a href="mailto:borgauf@gmail.com">borgauf@gmail.com</a>> wrote:<br><br></div><blockquote type="cite"><div><div dir="ltr">I'm in Bird's <i>Thinking Functionally with Haskell </i>and he has this code to transpose a matrix based on a list of row lists<div><br></div><div><font face="monospace">transpose :: [[a]] -> [[a]]</font><br></div><div><font face="monospace">transpose [xs] = [[x] | x <- xs]<br>transpose (xs:xss) = zipWith (:) xs (transpose xss)</font><br></div><div><br></div><div>then he says <font face="monospace">transpose</font> can be rewritten with this pattern</div><div><br></div><div><font face="monospace">transpose [] = ...</font><br></div><div><br></div><div>what could be the rest of it? The answer he gives is</div><div><br></div><div><font face="monospace">transpose2 :: [[a]] -> [[a]]<br>transpose2 [] = repeat []  <br>transpose2 (xs:xss) = zipWith (:) xs (transpose2 xss)</font><br></div><div><br></div><div>where <font face="monospace">repeat [] </font>gives an infinite list of repetitions. And, he says, note that</div><div><br></div><div><font face="monospace">transpose [xs] =  zipWith (;) xs (repeat []) = [[x] | x <- xs]</font><br></div><div><br></div><div>I suppose I get this last equation, but I don't understand <font face="monospace">repeat</font> in <font face="monospace">transpose2</font>. Can someone explain this to me?</div><div><br></div><div>LB</div><div><br></div></div>
</div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>Haskell-Cafe mailing list</span><br><span>To (un)subscribe, modify options or view archives go to:</span><br><span><a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a></span><br><span>Only members subscribed via the mailman list are allowed to post.</span></div></blockquote></body></html>