Analysis and use of GADT

I had a problem writing a parser. In particular, I want different types of values ​​to be returned. For example, I have two different types of data FAand PAfor representing two different classes of lipids -

data FA = ClassLevelFA IntegerMass
        | FA           CarbonChain
        deriving (Show, Eq, Ord)

data PA   = ClassLevelPA       IntegerMass
          | CombinedRadylsPA   TwoCombinedRadyls
          | UnknownSnPA        Radyl Radyl
          | KnownSnPA          Radyl Radyl
          deriving (Show, Eq, Ord)

Using attoparsec, I created parsers for parsing lipid contraction. For the data types mentioned above, I have parsers faParserand paParser. I would like to be able to analyze either FA, or PA. However, since FAand PAare different data types, I cannot do the following:

inputParser =  faParser
           <|> paParser

GADT, , . , GADT eval faParser paParser. -

data ParsedLipid a where
  ParsedFA :: FA -> ParsedLipid FA
  ParsedPA :: PA -> ParsedLipid PA

eval :: ParsedLipid a -> a
eval (ParsedFA val) = val
eval (ParsedPA val) = val

, , ParsedFA ParsedPA - ? , "PA 17:1_18:1" ParsedLipid PA ( ParsedLipid, ). inputParser - .

let lipid = use "PA 17:1_18:1"
*Main> :t lipid
lipid :: ParsedLipid PA

, ?

+3
2

@MathematicsOrchid , , , GADT, . XY, , . , GADT.

, ParsedLipid a, a, ; a . ParsedLipid FA ParsedLipid PA, .

, GADT - - .

data AParsedLipid = forall a. AParsedLipid (ParsedLipid a)

a AParsedLipid, . AParsedLipid ParsedLipid, . - , , , GADT.

, , , . ParsedLipid a -> a . , , , - , .

AParsedLipid, ParsedLipid , , a - FA, PA.

showFA :: FA -> String
showFA = ...
showPA :: PA -> String
showPA = ...

showLipid :: AParsedLipid -> String
showLipid (AParsedLipid (ParsedFA x)) = "AParsedLipid (ParsedFA "++ showFA x ++")"
showLipid (AParsedLipid (ParsedPA x)) = "AParsedLipid (ParsedPA "++ showPA x ++")"

, a AParsedLipid , . ; " ".

AParsedLipid, , , ParsedLipid . PA FA, .

parser :: Parser AParsedLipid
parser = AParsedLipid <$> (fmap ParsedFA faParser <|> fmap ParsedPA paParser)

GADT . ParsedLipid - AParsedLipid, Either FA PA. ( , .) , GADT , - , . , Yampa extensible-effects GADT . , , , , ( ). , FRP- .

+5

?

, FA PA, GADT - .

FA, PA, ... Either FA PA.

+3

Source: https://habr.com/ru/post/1623071/


All Articles