
Belka wrote:
Hello, communion people!
I seek for your advice in a matter, where it's really hard for me to determine a good programming style. Here's the problem. I'm generalizing multiple authorization procedures to one, using class definition. (if of any interest, the code is in the end.) The problem essense is folowing: ---------------- data SomeRole = Role1 | Role2 | Role3
class SomeClass a b c | a -> b, c where f1 :: ... f2 :: ... ... fn :: ... role :: SomeRole -- <-- here is the problem
I want to have a fuctional dependency from a type "a" on a value of *role*, so that I could easily "inspect" the *role* from within any other class members. Is it possible? Or do I rougly violate some style traditions?
The problem is that when you write role there is no way to choose the right instance? That is, where does the compiler get a, b, c from when looking just at an invocation of role ? Therefore, the type of role has to involve a , for example as in class SomeClass a b c ... where ... role :: a -> SomeRole and used as role (undefined :: Foo) That being said, I think that type classes are not what you want here. I suggest to simply use a regular data type data SomeThing a b c = SomeThing { f1 :: ... , f2 :: ... ... , fn :: ... , role :: SomeRole } Remember that f1, f2, ... can be functions, this is a functional language, after all! "Instances" are then simply a concrete value, like for example thething :: SomeThing Foo Bar Baz thething = SomeThing { f1 = id , f2 = filter (>3) . map length , ... , role = Role1 } Regards, apfelmus -- http://apfelmus.nfshost.com