Разрешение readEither на ADT - PullRequest
0 голосов
/ 06 декабря 2018

Здравствуйте, мне было интересно, если мне дали 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

Есть идеи?

1 Ответ

0 голосов
/ 06 декабря 2018

Разве это не то, что вам нужно?

readNumeric::Text -> Either String Numeric
readNumeric text=let str = u text in
                      if '.' `elem` str then 
                       fmap D (readEither str::Either String Double)
                      else
                       fmap I (readEither str::Either String Int)
...