Hello,<br><br>I would like to get some advice about state monad (or any other monad I guess) and CPS.<br><br>Let&#39;s take a simple exemple (see the code below)<br><br>&#39;walk&#39; is a function written in CPS that compute the number of nodes &amp; leaves in a tree. It use a counter which is explicitly passed through calls.<br>
&#39;walk2&#39; is does the same using the state monad but is not written in CPS<br><br>Is it possible to write a function &#39;walk3&#39; written in CPS and using the state monad? <br><br>Thank you<br><br>Regards<br><br>
J-C<br><br><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">module M where</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">import Control.Monad.State</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">data Node = </span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">     Node (Node, Int, Node)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    |Leaf Int</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    |Empty</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    deriving (Show)</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    </span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">walk Empty acc k = k acc</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">walk (Leaf _) acc k = k (acc+1)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">walk (Node (l, _, r)) acc k = let k1 acc = walk r acc k</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">                              in </span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">                              walk l (acc+1) k1</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">                            </span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">nb = Node (Leaf 1, 2, Leaf 3)</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">nd = Node (nb, 4, Empty)</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">nh = Node (Empty, 8, Leaf 9)</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">ng = Node (Leaf 6, 7, nh)</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">ne = Node (nd, 5, ng)</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">r = walk ne 0 id</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">walk2 Empty = return ()</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">walk2 (Leaf _ ) = do acc &lt;- get</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">                     put (acc+1)</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">                     return ()</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">walk2 (Node (l, _, r)) = do acc &lt;- get</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">                            put (acc+1)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">                            walk2 l</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">                            walk2 r</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">                            return ()</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">                            </span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">r2 = runState (walk2 ne) 0  </span><br>
                              <br>