That's good. (It's more or less the way I was doing it.)  What I wanted to avoid was this.

getGenderSpecificCondition (  Man _ _ cond) = cond
getGenderSpecificCondition (Woman _ _ cond) = cond

I know it seems like a small thing, but I would like to be able to write it like this.
getGenderSpecificCondition p
   | p == (Man _ _ cond) = cond
   | p == (Woman _ _ cond) = cond

But that's not legal syntax.  A pattern can't appear in that context. But this does the job.

getGenderSpecificCondition :: Person -> Condition
getGenderSpecificCondition p
   | isMan p = prostateCondition p
   | isWoman p = ovaryCondition p
   
isMan (     Man _ _ cond) = True
isMan _ = False
isWoman (Woman _ _ cond) = True
isWoman _ = False

That works! prostateCondition and ovaryCondition are both defined on Person. (I'm surprised to see that.)

*Person> Group [Man "Harry" 32 OK, Woman "Sally" 29 Good]
Harry(32, OK)
Sally(29, Good)

Also 

*Person> prostateCondition (Woman "Sally" 29 Good)
*** Exception: No match in record selector prostateCondition
*Person> prostateCondition (Man "Harry" 29 Good)
Good


-- Russ



On Tue, Dec 14, 2010 at 12:31 PM, Michael Katelman <katelman@uiuc.edu> wrote:
Perhaps this?

https://gist.github.com/741048

-Mike

On Tue, Dec 14, 2010 at 2:27 PM, Russ Abbott <russ.abbott@gmail.com> wrote:
> What I'm after is a version of my example that compiles.  Can you make one?
>
> -- Russ
>
>
> On Tue, Dec 14, 2010 at 12:18 PM, Antoine Latter <aslatter@gmail.com> wrote:
>>
>> Sorry, I really don't know enough about what you're after to attempt that.
>>
>> But you'll need to change you're signatures of the form:
>>
>> > function :: Person -> Foo
>>
>> to something of the form:
>>
>> > function :: Person p => p -> Foo
>>
>> Because again, a type class can not be used as a type.
>>
>> Antoine
>>
>> On Tue, Dec 14, 2010 at 2:12 PM, Russ Abbott <russ.abbott@gmail.com>
>> wrote:
>> > What got fouled up is all the adjustments I had to make to the other
>> > declarations.
>> > Can you complete the example so that it compiles using
>> >
>> > class Person p where ...
>> >
>> > I'd very much like to see an example that actually compiles.
>> >
>> > Thanks.
>> > -- Russ
>> >
>> > On Tue, Dec 14, 2010 at 11:58 AM, Antoine Latter <aslatter@gmail.com>
>> > wrote:
>> >>
>> >> On Tue, Dec 14, 2010 at 1:52 PM, Russ Abbott <russ.abbott@gmail.com>
>> >> wrote:
>> >> > If gender is a field in a Person type, then a Person must have both
>> >> > an
>> >> > ovaryCondition and a prostateCondition.  That seems awkward.
>> >> > Regarding
>> >> >      class Person p where
>> >> > I started down that path but got completely fouled up.
>> >>
>> >> How did this get fouled up? Every class declaration must take
>> >> arguments - here, 'p' is the argument for the class.
>> >>
>> >> Thanks,
>> >> Antoine
>> >
>> >
>
>
> _______________________________________________
> Beginners mailing list
> Beginners@haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>
>