GADTs和DataKinds对我来说是未开发的领域,因此我不了解它们的一些限制和功能.
所以我正在为JavaScript代码发射器编写一个AST,并且我已经确定了表达式之间的一个边缘情况,那就是它们可以是引用或不引用.所以我使用GADTS和datakinds来键入JavaScript表达式语义的这个方面.ast看起来像这样.
-- at the moment I'm just using a bool to identify if the expression
-- behaves as an reference, but I'll probably change it due to the fact
-- a bool is pretty vague
data JSExp :: Bool -> * where
JSNumber :: Double -> JSExp False
JSBool :: Bool -> JSExp False
JSReference :: Text -> JSExp True
JSProperty :: JSExp a -> Text -> JSExp True
JSAssign :: JSExp True -> JSExp b …Run Code Online (Sandbox Code Playgroud)