Здравствуйте, мне было интересно, если мне дали Algebraic Data Type
, как я могу решить следующую проблему:
u::Text->String
u =Data.Text.unpack
data Numeric=I Int | D Double
readNumeric::Text->Either String Numeric
readNumeric text=let str=u text in
if '.' `elem` str then
D (readEither str::Either String Double)
else
I (readEither str::Either String Int)
Как я могу покрыть оба sides
из Either
, учитывая ADT
?Практически 2*2
случаев, равномерно?
Я рассматривал возможность использования fromRight
на каждой ветви (например, fromRight (D 0)
) pattern-matching
(в нашем случае, если существует только 2 случая), но я делаюне знаю, если это лучший подход.Но fromRight
возвращает внутренний тип. Я хочу сохранить Either
Есть идеи?