[Haskell-beginners] Equivalence of Inheritance
Russ Abbott
russ.abbott at gmail.com
Tue Dec 14 22:30:32 CET 2010
Now that this is straightened out, I went back to what I was doing in the
first place and realized that I haven't solved my problem.
Given
data Person =
Man {name :: String, age :: Int, prostateCondition :: Condition}
| Woman {name :: String, age :: Int, ovaryCondition :: Condition}
I'd like to define something like this.
type MensGroup = [Man]
Is there a way to do something like that?
*
-- Russ *
*
*
On Tue, Dec 14, 2010 at 1:06 PM, Russ Abbott <russ.abbott at gmail.com> wrote:
> 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 at uiuc.edu>wrote:
>
>> Perhaps this?
>>
>> https://gist.github.com/741048
>>
>> -Mike
>>
>> On Tue, Dec 14, 2010 at 2:27 PM, Russ Abbott <russ.abbott at 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 at 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 at 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 at gmail.com
>> >
>> >> > wrote:
>> >> >>
>> >> >> On Tue, Dec 14, 2010 at 1:52 PM, Russ Abbott <russ.abbott at 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 at haskell.org
>> > http://www.haskell.org/mailman/listinfo/beginners
>> >
>> >
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20101214/75a6d80f/attachment-0001.htm>
More information about the Beginners
mailing list