<div dir="ltr">I have a problem which I can solve with OO organization, but I want to know how to do it properly in Haskell.<div><br></div><div>I have a search optimization problem in which there are a lot of individual fitness functions which combine scores to give an overall fitness level.</div><div><br></div><div>Each fitness function will be associated with data, both initial data to configure it, and a cache that it maintains.</div><div><br></div><div>So I could have something like this:</div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">data Fitness = Fit1 SomeData1</font></div><div><font face="monospace, monospace">             | Fit2 SomeData2</font></div><div><font face="monospace, monospace">             | Fit3 SomeData3</font></div><div><font face="monospace, monospace"><br>-- this function would evaluate the fitness of a particular</font></div><div><font face="monospace, monospace">-- result of type 'S' (in my case, a partially-constructed</font></div><div><font face="monospace, monospace">-- musical composition)</font></div><div><font face="monospace, monospace">evaluate :: Fitness -> S -> (Fitness,Double)</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">-- something like this would have to be written for</font></div><div><font face="monospace, monospace">-- every sub-type of "Fitness"<br></font></div><div><font face="monospace, monospace">evaluate (Fit1 d) s = (Fit1 d',v)</font></div><div><font face="monospace, monospace">  where</font></div><div><font face="monospace, monospace">    (d',v) = evaluate1 d s</font></div><div><br></div><div><font face="monospace, monospace">evaluate1 :: SomeData1 -> S -> (SomeData1,Double)</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Is there a better way to do this?</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">D</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">                   </font></div></div>