<div class="gmail_quote">On Sun, Oct 9, 2011 at 7:57 PM, Captain Freako <span dir="ltr">&lt;<a href="mailto:capn.freako@gmail.com">capn.freako@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px; background-color: rgb(255, 255, 255); "> 21 applyFilter :: Filter e a -&gt; FilterState -&gt; a -&gt; (Either e a, FilterState)</span><br>
 22 applyFilter f s x  = runState (runEitherT (runFilter f)) s<br><br>I still don&#39;t understand how I&#39;m supposed to feed the input, `x&#39;, into the filter.<br></blockquote><div><br></div><div>In &#39;Filter e a&#39;, a is an output type, not an input type. If you want inputs, you&#39;ll need constructors of the form (a -&gt; Filter e b). </div>
<div><br></div><div>This might be closer to what you&#39;re looking for: </div><div><br></div><div>  applyFilter :: FilterState -&gt; (a -&gt; Filter e b) -&gt; a -&gt; (Either e b, FilterState)</div><div>  applyFilter s f x = runState (runEitherT (runFilter (f x))) s</div>
<div><br></div><div>The burden of receiving input is then shifted to the functions that create &#39;Filter&#39; operations.</div><div><br></div><div>If you really want the input type to be part of the Filter type definition, you&#39;ll need to use arrows instead of monads.</div>
<div><br></div><div><br></div></div>