<div dir="ltr"><div>Thanks Vanessa. The issue is that not everything will have a position or velocity. And some things will have more than those. There's a large overlapping set of possibilities that I can't quite predict until after I've finished several versions.<br></div><div><br></div><div>However, I think I have a solution. This is actually in Purescript, which has has extensible record types. Each object will be represented by its own unique record, but there are mechanisms to write polymorphic code that operates on just portions of the records. I think that will get me through the first few versions of this program.</div><div><br></div><div>Purescript also has dynamic types, but I suspect those will be hard to debug. When I'm developing code, I like to get helpful error messages. Please, no untraceable crashes from many levels deep in the stack. I don't know if that's what happens when a dynamic type fails to be the expected type, but I do know that these kinds of crashes are even harder to debug in Purescript than Haskell, as they happen in the compiled Javascript (which I don't understand much).</div><div><br></div><div>D<br></div><div><br></div><div>Mike</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Jul 28, 2018 at 9:14 PM, Vanessa McHale <span dir="ltr"><<a href="mailto:vanessa.mchale@iohk.io" target="_blank">vanessa.mchale@iohk.io</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div text="#000000" bgcolor="#FFFFFF">
    <p>If everything you use will have a color, position, and velocity
      I'd just use a product type, i.e.<br>
      <br>
      data itemState = ItemState Color Point Vector<br>
      <br>
      or even <br>
      <br>
      data ItemState = ItemState (Maybe Color) (Maybe Point) (Maybe
      Vector)<br>
      <br>
      Alternately, if you do want to go the dynamic route,
      `Data.Dynamic` in `base` actually has some facilities for dynamic
      programming<br>
    </p><div><div class="h5">
    <br>
    <div class="m_6781056858891576128moz-cite-prefix">On 07/28/2018 05:04 PM, Dennis Raddle
      wrote:<br>
    </div>
    </div></div><blockquote type="cite"><div><div class="h5">
      
      <div dir="ltr">
        <div>I'm actually working in Purescript, but the issue is pretty
          much the same as one would encounter in Haskell.</div>
        <div><br>
        </div>
        <div>My application (animation of math-related ideas) is
          changing constantly. It's research, and I don't know where
          I'll be with it next week, or even tomorrow.</div>
        <div><br>
        </div>
        <div>For instance, the kinds of "objects" I'm animating
          (numbers, equations) and the way they move and interact with
          each other is a research project, and I'm constantly ripping
          out parts of my application and scavenging them for variations
          on a theme.</div>
        <div><br>
        </div>
        <div>My objects need state. At this point I'm thinking of just
          putting the state into a map with strings as keys and some
          kind of sum type to represent each data item I might need.</div>
        <div><br>
        </div>
        <div>So if I want to represent that an object has a particular
          color and position and velocity, <br>
        </div>
        <div><span style="font-family:monospace,monospace"><br>
          </span></div>
        <div><span style="font-family:monospace,monospace">itemState =
            M.fromList <br>
          </span></div>
        <div><span style="font-family:monospace,monospace">  [("color"  
            , DataColor  blue       )</span></div>
        <div><span style="font-family:monospace,monospace"> 
            ,("position", DataPoint  500.0 100.0)</span></div>
        <div><span style="font-family:monospace,monospace"> 
            ,("velocity", DataVector 50.0 45.0  ) ]</span></div>
        <div><span style="font-family:monospace,monospace"><br>
          </span></div>
        <div><span style="font-family:arial,helvetica,sans-serif">Which
            starts to look more like a dynamically-typed scripting
            language. But it's not hard to work with. I can uses
            lenses/prisms to inspect and update state, and it's okay if
            my program crashes on encountering malformed state.</span></div>
        <div><span style="font-family:arial,helvetica,sans-serif"><br>
          </span></div>
        <div><span style="font-family:arial,helvetica,sans-serif">What
            this lets me do is create new objects that mix and match
            parts of old objects, and copy and paste a lot of the code.
            <br>
          </span></div>
        <div><span style="font-family:arial,helvetica,sans-serif"><br>
          </span></div>
        <div><span style="font-family:arial,helvetica,sans-serif">Is
            there a better way to do this? Is there a compromise I can
            make that will allow the compiler to help me out more with
            finding errors at compile time?</span></div>
        <div><span style="font-family:arial,helvetica,sans-serif"><br>
          </span></div>
        <div><span style="font-family:arial,helvetica,sans-serif">D<br>
          </span></div>
        <div><span style="font-family:arial,helvetica,sans-serif"><br>
          </span></div>
        <div><span style="font-family:monospace,monospace"><br>
          </span></div>
        <div><span style="font-family:monospace,monospace"><br>
          </span></div>
        <div><br>
        </div>
        <div><br>
        </div>
      </div>
      <br>
      <fieldset class="m_6781056858891576128mimeAttachmentHeader"></fieldset>
      <br>
      </div></div><pre>______________________________<wbr>_________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
<a class="m_6781056858891576128moz-txt-link-freetext" href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/haskell-<wbr>cafe</a>
Only members subscribed via the mailman list are allowed to post.</pre>
    </blockquote>
  </div>

<br>______________________________<wbr>_________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/haskell-<wbr>cafe</a><br>
Only members subscribed via the mailman list are allowed to post.<br></blockquote></div><br></div>