> extract :: Question' -> Question a
> extract q = case q of
> QuestionS x -> extractQString q
> QuestionI x -> extractQInt q
> QuestionD x -> extractQDouble q
Antoine wrote:
>> What is a caller supposed to do with this function? How were you
>> imagining it would be called?
The sole purpose of the above function would be to unbox the inner parametrized (Question a) type
from its (Question') wrapper. If it were possible I could write this:
testQ' :: Question' -> Answer -> Bool
testQ' q a = testQ (extract q)
a
given:
testQ :: (Eq a) => Question a -> Answer -> Bool
testQ q ans = case (correctAnswer q) of
Nothing -> False
Just x -> x == (answerFunc q $ ans)
instead of this
testQ' :: Question' -> Answer -> Bool
testQ' q a = case q of
QuestionS x -> testQS q a
QuestionI x -> testQI q a
QuestionD x -> testQD q a
where
testQS q a = testQ (extractQString q) a
testQI q a = testQ (extractQInt q) a
testQD q a = testQ (extractQDouble q) a
In fact this seemingly redundant pattern emerges in all wrapper handling code, for instance:
askQ' :: Question' -> IO Answer
askQ' q = case q
of
QuestionS x -> askQS q
QuestionI x -> askQI q
QuestionD x -> askQD q
where
askQS q = askQ (extractQString q)
askQI q = askQ (extractQInt q)
askQD q = askQ (extractQDouble q)
Hope this clarifies things somewhat.
Alia
Alia