Haskell 如何将字符串解析为GADT

Haskell 如何将字符串解析为GADT,haskell,parsec,gadt,combinatory-logic,Haskell,Parsec,Gadt,Combinatory Logic,我正在尝试在Haskell中实现组合逻辑,我想为该语言编写解析器。我无法通过Parsec让解析器工作。基本问题是,我需要一种方法来确保解析器返回的对象类型正确。有人对如何做到这一点有什么创造性的想法吗 {-# Language GeneralizedNewtypeDeriving #-} import qualified Data.Map as Map import qualified Text.ParserCombinators.Parsec as P import Text.Parsec.

我正在尝试在Haskell中实现组合逻辑,我想为该语言编写解析器。我无法通过Parsec让解析器工作。基本问题是,我需要一种方法来确保解析器返回的对象类型正确。有人对如何做到这一点有什么创造性的想法吗

{-# Language GeneralizedNewtypeDeriving #-}

import qualified Data.Map as Map
import qualified Text.ParserCombinators.Parsec as P
import Text.Parsec.Token (parens)
import Text.ParserCombinators.Parsec ((<|>))
import Control.Applicative ((<$>), (<*>), (*>), (<*))


data CTree = CApp CTree CTree | CNode String deriving (Eq, Read)
instance Show CTree where
    show c@(CApp x y) = showL c
        where showL (CApp x' y')= "(" ++ showL x' ++ " " ++ showR y' ++ ")"
              showL (CNode s) = s
              showR (CApp x' y') = "(" ++ showL x' ++ " " ++ showR y' ++ ")"
              showR (CNode s) = s

    show (CNode s) = s

-- | Parser
parseC :: String -> Maybe CTree
parseC s = extract$ P.parse expr "combinator_string" s
           where extract (Right r) = Just r
                 extract (Left e) = Nothing


expr :: P.CharParser () CTree
expr = P.try (CApp <$> (CApp <$> term <*> term) <*> expr)
       <|> P.try (CApp <$> term <*> term)
       <|> term


term = P.spaces *> (node <|> P.string "(" *> expr <* P.string ")")


node :: P.CharParser () CTree
node = CNode <$> (P.many1 $ P.noneOf "() ") 

eval (CApp (CNode "I") x) = x
eval (CApp (CApp (CApp (CNode "S") f) g) x) = 
    (CApp (CApp f x) (CApp g x))
eval (CApp (CApp (CApp (CNode "B") f) g) x) = 
    (CApp f (CApp g x))
eval (CApp (CApp (CApp (CNode "C") f) g) x) = 
    (CApp (CApp f x) g)
eval x = x
{-#语言泛化newtypederiving}
导入符合条件的数据。映射为映射
将限定的Text.ParserCombinators.Parsec作为P导入
导入Text.Parsec.Token(参数)
导入Text.ParserCombinators.Parsec(())
导入控制。应用程序((),(),(*>),(可能是CTree)
parseC s=extract$P.parse expr“combinator_string”s
其中提取(右r)=仅r
提取(左e)=无
expr::P.CharParser()CTree
expr=P.try(CApp术语expr)
P.try(CApp术语)
学期

term=P.spaces*>(node P.string)(“*>expr

我强烈主张解析为单类型表示,然后应用类型检查/细化阶段将其转换为类型化(GADT)表示。关于一般思想的最佳教程可能来自

滑雪演算的表示形式可能如下所示

data TyComb t where
  TyS   :: TyComb ((a -> b -> c) -> (a -> b) -> a -> c)
  TyK   :: TyComb (a -> b -> a)
  TyI   :: TyComb (a -> a)
  TyApp :: TyComb (a -> b) -> TyComb a -> TyComb b

evalTyComb :: TyComb t -> t
evalTyComb TyS         = \x y z -> (x z) (y z)
evalTyComb TyK         = const
evalTyComb TyI         = id
evalTyComb (TyApp a b) = (evalTyComb a) (evalTyComb b)

您可能希望使用存在式或更高级别的延续(不太可能,因为这里可能需要非指示类型)。