[Haskell-cafe] Declaring Functors for Type constrained data types

Guru Devanla gurudev.devanla at gmail.com
Tue Feb 28 00:48:31 UTC 2017


Hello All,

I am working on a program that will define a bunch of tasks. Each task
will have to implement certain methods as part of a type class.

-- task 1
data UpdateAcctsTask = UpdateAccts

-- task 2
data EmailConfig = EmaiConfig {someattrs::String}
data SendEmailTask = SendEmailsTask EmailConfig

-- task 3
data GeneralWriterTask a = GeneralWriterTask a

Each of these tasks implement a class, Taskable. The return
values are simplified for this example.

class Taskable a where
  process :: a -> Bool
  can_run :: a -> Bool


This works fine. I can expand on these tasks and execute them.

Now, I wanted to be able to defined dependencies between these
(Taskable's). I decided
I could create a data type for this dependency and may be also get a
FreeMonad
around this structure for further processing using a graph of Tasks. But,
before that I wanted
to create an wrapper for these Taskables and create a functor for it as
follows

The first thing I did was, define a Task, which generalizes over all
the above defined (and future Taskables)

data Task a where
  Task :: (Taskable a) => a -> Task a


instance Functor Task where
  fmap:: (Taskable a, Taskable b) -> (a -> b) -> Task a  -> Task b    ---
THIS DOES NOT WORK
  fmap f (Task a) = Task $ f a


But, I realized that I cannot define an fmap over a type constraint.

My questions are:

1. Is there any way to do this. I see there is an answer of SO. I wanted
   to make sure if there were any improvements to this since that answer'
   was posted.

http://stackoverflow.com/questions/17157579/functor-instance-for-a-gadt-with-type-constraint

2. Secondly, I would like to know why this is not possible. Is it a current
   limitation of GHC or if there is some fundamental category theory
concepts
   that dis-allows such declarations that I need to grok!

Appreciate any help on this. Thank you!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20170227/e11f8b9c/attachment.html>


More information about the Haskell-Cafe mailing list