<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style>
</head>
<body lang="EN-GB" link="blue" vlink="#954F72" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal">Hello – in</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal" style="text-indent:36.0pt">myFoldl :: (t -> a -> t) -> t -> [a] -> t<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">the t and the a are type variables. There are no “classes” at all. Since you didn’t name the type variables, Haskell has provided default names for you “at random”, and it’s in some ways a little unfortunate that it’s named one of them
 t.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">You could (probably should) provide your own declaration, e.g. renaming t to b:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal" style="text-indent:36.0pt">myFoldl :: (b -> a -> b) -> b -> [a] -> b<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">This represents exactly the same thing, and says that myFoldl will work for any two types a and b. It takes three params:</p>
<p class="MsoNormal">                (b -> a -> b)         A function of values of type b and type a</p>
<p class="MsoNormal" style="margin-left:72.0pt;text-indent:36.0pt">that returns a value of type b.                                    (The accumulation function)</p>
<p class="MsoNormal">                b                             A value of type b                                                              (The initial accumulated value)</p>
<p class="MsoNormal">                [a]                          A list of values of type a                                                 (This list to accumulate over)</p>
<p class="MsoNormal">and returns</p>
<p class="MsoNormal">                b                             A value of type b                                                              (The final accumulated value)</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The prelude function:</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal" style="text-indent:36.0pt">foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">is then almost identical. This time, though, instead of being restricted to a list of values (of type a) to fold over, it can fold over any type of foldable collection of values (of type a). t represents the type of the foldable collection,
 and Foldable t => is a constraint that says the function will only work for a type t that is an instance of the class Foldable.</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">[<i>BTW: </i><i>does a type declaration like this one reflect in any way the recursion going on?</i> I didn’t really understand the question, but you can often deduce what a function does, and how it might be implemented, from its type
 signature.]<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I don’t know how you’re going about learning Haskell, but following a tutorial (such as
<a href="http://learnyouahaskell.com/">http://learnyouahaskell.com/</a>) might be helpful, and I think explains all of the above step by step.</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Regards, David.</p>
<p class="MsoNormal"><o:p> </o:p></p>
<div style="mso-element:para-border-div;border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal" style="border:none;padding:0cm"><b>From: </b><a href="mailto:borgauf@gmail.com">Lawrence Bottorff</a><br>
<b>Sent: </b>02 January 2021 17:52<br>
<b>To: </b><a href="mailto:beginners@haskell.org">The Haskell-Beginners Mailing List - Discussion of primarily beginner-level topics related to Haskell</a><br>
<b>Subject: </b>[Haskell-beginners] Type explanation of foldl?</p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">I've got this<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">myFoldl f init [] = init<br>
myFoldl f init (x:xs) = myFoldl f newInit xs<br>
  where newInit = f init x<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">which when evaluated gives this for its type<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">> :t myFoldl<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">myFoldl :: (t -> a -> t) -> t -> [a] -> t<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">. . . not totally sure what that all means, e.g., how the t as a generic class is behaving is very mysterious. Obviously, the final result is of type t . . . and that must relate to the incoming argument init, correct? (BTW, does a type
 declaration like this one reflect in any way the recursion going on?)  But then with Prelude foldl I'm really clueless<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">> :t foldl<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">I'm guessing the t is again a generic type of the Foldable class, but then. . .  Can someone walk me through this?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
<p class="MsoNormal">LB<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>