Haskell type and pattern matching question: extracting fields from a data type

Я новичок в Haskell и прохожу свой путь через проект "Напиши себе схему за 48 часов" и столкнулся с ситуацией, когда я хочу получить базовый тип из типа данных и не уверен, как это сделать без написания преобразований для каждого варианта типа. Например, в типе данных

data LispVal = Atom String
             | List [LispVal]
             | DottedList [LispVal] LispVal
             | Number Integer
             | String String
             | Bool Bool
             | Double Double

я хочу написать что-то вроде: (я знаю, что это не работает)

extractLispVal :: LispVal -> a
extractLispVal (a val) = val

или даже

extractLispVal :: LispVal -> a
extractLispVal (Double val) = val
extractLispVal (Bool val) = val

Возможно ли это сделать? В основном я хочу иметь возможность делать обратный кастинг из LispVal, если мне нужно использовать основной тип.

Спасибо! Simon

6
задан Don Stewart 18 May 2011 в 16:30
поделиться