[Haskell-beginners] data design for a questionnaire (retitled + update)

David McBride toad3k at gmail.com
Fri Nov 25 04:07:51 CET 2011


Why not have:

data Question = Question
    { questionName    :: Name
    , questionText    :: QuestionText
    , questionType    :: QuestionType
    , answerFunc      :: (String -> AnswerType)
    , correctAnswer   :: Maybe AnswerType
    , options         :: Maybe [Option AnswerType]
    } deriving (Show)

data AnswerType = AnsD Double | AnsS String | AnsI Integer deriving (Show, Read)

Then, I'd personally make another change, why would you have a flat
structure with a questionType and then optional correctAnswer and
options fields?  There's no type safety in that.  I'd try:

data Answer = StraightAnswer (String -> AnswerType) | MultipleChoice
AnswerType [Option AnswerType]

data Question = Question
    { questionName    :: Name
    , questionText    :: QuestionText
    , answerFunc      :: (String -> AnswerType)
    , answer              :: Answer
    } deriving (Show)

If you are storing answers as string, just store them as "AnsD 5.589",
"AnsS \"Constantiople\"".  Then with the read instance you can go:

let answer = read x :: AnswerType

On Thu, Nov 24, 2011 at 4:52 PM, Alia <alia_khouri at yahoo.com> wrote:
>
> Peter Hall wrote:
>> Might this be easier if you made all the answers strings? If you need to
>> permit things like 0.5 vs .5 you could instead > use a String->String
>> normalisation function which could vary with the "type" of the answer but
>> not affect the data type > of the question.
>> It would also be easier to use strings if you wanted to store the
>> questions in a database or load from a file.
>
> Indeed that is exactly how I do it. All user entered answers are stored as
> strings, and are converted to the
> appropriate type by an answerFunc (see below) and compared against correct
> answers. The purpose of the
> answerFunc is simply to convert (String -> type of answer) and can include
> normalization if required.
> Fyi, the complete schema is as follows:
>
> data QuestionType   = Open
>                     | Test
>                     | Choice
>                       deriving (Show, Eq)
>
> data Question a = Question
>     { questionName    :: Name
>     , questionText    :: QuestionText
>     , questionType    :: QuestionType
>     , answerFunc      :: (String -> a)
>     , correctAnswer   :: Maybe a
>     , options         :: Maybe [Option a]
>     } deriving (Show)
>
> data Question' = QuestionS (Question String)
>                | QuestionI (Question Int)
>                | QuestionD (Question Double)
>                  deriving (Show)
>
> data QuestionSet = QuestionSet
>     { qsetTitle     :: String
>     , qsetQuestions :: [Question']
>     , qsetPoints    :: Double
>     } deriving (Show)
>
> data Survey = Survey
>     { surveyTitle        :: String
>     , surveyQuestionSets :: [QuestionSet]
>     } deriving (Show)
>
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>
>



More information about the Beginners mailing list