[Haskell-cafe] Basic type classing question.

Marc Ziegert coeus at gmx.de
Tue Sep 20 23:19:41 EDT 2005


maybe, i completely missunderstand you. please, could you program your example in another language than haskell, one you know better?
i'm not sure -- did you try to define variables instead of types?

data Employee = Emp
data Department = Dept
translated to c++ this means sth like
typedef void Employee;
typedef void Department;

did you want sth like ...?
data Employee = Emp [(String,Either String Int)]
emp1 :: Employee
emp1=Emp [("Name",Left "Karl Ranseier"),("Identifier",Right 7),("Address",Left "Graveyard 13")]

-marc


Karl Grapone wrote:
> Hi,
> 
> I've just started learning Haskell, and I must admit I'm finding it a
> bit hard to get my head around the typing system...
> 
> If I wanted to represent Employees and Departments in a Haskell
> program I could use data declarations like so:
> data Employee = Emp ...
> data Department = Dept ...
> 
> This seems limited in (at least) two ways:
> I can't dynamically add fields to an employee or department, and
> once I pull a field out of an instance I lose type information.
> 
> 
> What I want to be able to do is add and remove fields while the system
> is running, I suppose via hs-plugins, and I should be prevented from,
> for example, accidentally taking an employees first name and using it
> as a departments address.
> 
> My first attempt was the following, which isn't even valid and doesn't
> appear to buy me much anyway.
> 
> class DataContainer c
> 
> class DataContainer c => DataField f c a where
>   extract :: f -> a
>   apply :: (a -> a -> a) -> f -> f -> f
> 
> data DataContainer c => Field c a = Fld c a
> instance DataField Field c a where
>   extract (Fld _ a) = a
>   apply f (Fld c a1) (Fld _ a2) = Fld c (f a1 a2)
> 
> 
> data Employee = Emp
> instance DataContainer Employee
> 
> data Department = Dept
> instance DataContainer Department
> 
> type EmployeeName = Field Employee String
> type EmployeeAddress = Field Employee String
> type EmployeeIdentifier = Field Employee Integer
> type DepartmentAddress = Field Department String
> type DepartmentIdentifier = Field Department Integer
> ...
> 
> 
> The 'DataField instance Field' declaration gives kind errors regarding
> how many type arguments Field is applied to.  I don't claim to
> understand kinds at this point.
> Even if it did work, apply doesn't appear to force the arguments to be
> of the same type, and the declared type synonyms aren't enough to
> prevent me getting employee names and addresses confused.
> 
> Is there a correct way to express what I'm trying to do?  Or is it a
> bad idea to start with?
> 
> Thanks
> Karl
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
> 



More information about the Haskell-Cafe mailing list