Hello,<br>
In a recent thread, it has been asserted that defining type class is something you seldom need when programming in Haskell.<br><br>There is one thing that as non-professional Haskell programmer I found 
type-classes useful for: Testing. This is probably very OO and is pretty 
much influenced by what I read in RWH but I find useful to define TC 
that abstract away from low-level interactions with other code, possibly
 IO related, in such a way that I can have one implementation for 
testing and one implementation for real work that is wired in caller 
context. This is what is called &quot;mockist&quot; TDD in some circles: Write 
code that expresses what it needs in its own terms, then implement 
&quot;glue&quot; to the code that provide the concrete behaviour. <br>
<br>For example, while designing some program (a game...) I defined a type class thus:<br><br>&gt; class (Monad io) =&gt; CommandIO io where<br>&gt;  readCommand  :: io Command<br>&gt;  writeResult  :: CommandResult -&gt; io ()<br>
<br>Then I defined in a module Commands.IO :<br><br>&gt; instance CommandIO IO where<br>&gt;  readCommand = do input &lt;- getLine <br>&gt;  ...<br>&gt; writeResult r         = putStrLn $ show r<br><br>and for the purpose of testing I defined in some test module:<br>
<br>&gt; instance CommandIO (S.State ([Command],[CommandResult])) where<br>&gt;   readCommand   = do ((c:cs),rs) &lt;- S.get<br>&gt; ....<br>&gt;   writeResult r = do (cs,rs) &lt;- S.get<br>&gt; ...<br><br>Is this badly designed  code that tries to mimic OO in a functional setting? If the answer is yes, how could I achieve same result (eg. testing the code that does command REPL) without defining type classes?  <br>
<br>Regards,<br>Arnaud<br><br><br>