Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p><code>&gt;&gt;=</code> aka bind has the signature: <code>m a -&gt; (a -&gt; m b) -&gt; m b</code>. If we try to make this signature specific to Reader i.e replacing <code>m</code> with <code>Reader r</code> we will find that it becomes:</p> <p><code>(Reader r) a -&gt; (a -&gt; (Reader r) b) -&gt; (Reader r) b</code></p> <p>Which is same as:</p> <p><code>Reader r a -&gt; (a -&gt; Reader r b) -&gt; Reader r b</code></p> <p>Now we need to write such a function:</p> <p><code>(&gt;&gt;=) m k = ...</code> where <code>m</code> is <code>Reader r a</code> and <code>k</code> is <code>(a -&gt; Reader r b)</code> and we need to return <code>Reader r b</code></p> <p>How can you create <code>Reader r b</code> as this is something that we have to return ? Well, <code>k</code> is a function that will allow you to create <code>Reader r b</code> but <code>k</code> need some value of type <code>a</code> to return <code>Reader r b</code>.</p> <p>How we can get a value of type <code>a</code> (so that we can use function <code>k</code>) ? Looks like <code>m</code> parameter which is of type <code>Reader r a</code> can help us to get a value of type <code>a</code>.</p> <p>How do we get value of <code>a</code> from <code>Reader r a</code>? <code>runReader</code> has a type <code>Reader r a -&gt; r -&gt; a</code>, so if we call <code>runReader</code> on <code>m</code> we will get <code>(r -&gt; a)</code> but we were looking for value of <code>a</code> type and what we got is <code>(r -&gt; a)</code> and it seems we don't have any <code>r</code> value to get <code>a</code>. It seems we are stuck as we don't have any other parameter to look for.</p> <p>Let's assume we somehow has some <code>r</code> value (called <code>r_val</code>) so that we can do:</p> <p><code>let a_val = runReader m r_val</code> gives us value of type <code>a</code>.</p> <p>from <code>a</code> we need to get <code>Reader r b</code> using k</p> <p><code>let reader_r_b_val = k a_val</code> gives us value of type <code>Reader r b</code> and that's it, we got what we need to return, lets combine all the above 2 lets:</p> <p><code>k (runReader m r_val)</code> which is <code>Reader r b</code> BUT we are not done yet, we need to do something of <code>r_val</code> which was just a placeholder. Lets say we take <code>r_val</code> as param</p> <p><code>\r_val -&gt; k (runReader m r_val)</code> which is of type <code>r -&gt; Reader r b</code> ... Hmmm but we only need to return <code>Reader r b</code> .. can we somehow wrap <code>r -&gt; Reader r b</code> into a <code>Reader r b</code> ?</p> <p><code>Reader $ (\r_val -&gt; k (runReader m r_val))</code> has a type <code>Reader r (Reader r b)</code> .. looks like we are almost there we just need to convert <code>Reader r (Reader r b)</code> to <code>Reader r b</code> i.e we need the to convert inner <code>Reader r b</code> to just <code>b</code> and for that we can use <code>runReader</code> so:</p> <p><code>Reader $ (\r_val -&gt; runReader (k (runReader m r_val)) r_val)</code></p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload