<div dir="ltr">Overall context: <span style="font-size:12.8px">I'm trying to port the DelayedJob library from Ruby/Rails world to Haskell. The basic idea is to serialise a job and write it to the DB, deserialise it, and run the job using a job-runner function, which is determined by the job-type.</span>
<div><span style="font-size:12.8px"><br></span></div><div><div style="font-size:12.8px">I'm using a type-class to define the custom job-runner, something on the lines of:</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">    class (FromJSON j, ToJSON j) => DelayedJob j where</div><div style="font-size:12.8px">      runJob :: j -> AppM ()</div></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">    data SyncContactsJob = SyncContactsJob { userId :: UserId } deriving (Eq, Show, Generic, FromJSON, ToJSON)</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">    instance DelayedJob SyncContactsJob where</div><div style="font-size:12.8px">      runJob job = do</div><div style="font-size:12.8px">        -- entire job execution logic comes here</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Is there **any** type-system hackery, that will let me take a runtime value, eg. "SyncContactsJob", "DoBackupJob", and use that to run the correct version of the `runJob` function? That is,  how do I write the following function:</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">   invokeJob :: JobId -> AppM ()</div><div style="font-size:12.8px">   invokeJob jid = do</div><div style="font-size:12.8px">       jobRow <- fetchJob jid</div><div style="font-size:12.8px">       let jtype = jobRow ^. jobtype -- this will have "SyncContactsJob"</div><div style="font-size:12.8px">            jvalue = jobRow ^. jobdata -- this will have a Data.Aeson.Value</div><div style="font-size:12.8px">       runJob (......) -- QUESTION: What do I write here to make this compile?</div></div>