Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 将字符串转换为自定义数据类型Haskell_Parsing_Haskell_Custom Type - Fatal编程技术网

Parsing 将字符串转换为自定义数据类型Haskell

Parsing 将字符串转换为自定义数据类型Haskell,parsing,haskell,custom-type,Parsing,Haskell,Custom Type,我已经创建了一个自定义数据类型Expr type Name = String type Domain = [Integer] data Expr = Val Integer | Var Name | Expr :+: Expr | Expr :-: Expr | Expr :*: Expr | Expr :/: Expr | Expr :%: Expr deriving Eq 我需要创建一个解析器,该解析器从字符串创建数据类型Expr,而不使用Haskell中的解析器库 我

我已经创建了一个自定义数据类型Expr

type Name = String
type Domain = [Integer]
data Expr = Val Integer
 | Var Name
 | Expr :+: Expr
 | Expr :-: Expr
 | Expr :*: Expr
 | Expr :/: Expr
 | Expr :%: Expr
    deriving Eq
我需要创建一个解析器,该解析器从字符串创建数据类型Expr,而不使用Haskell中的解析器库

我已经为初始字符串创建了解析器,该字符串接受形式为“2*a+b”的字符串,并将其转换为Expr接受的形式为“Val 2:::Var“a”:+:Var“b”,但我不知道在这里要做什么才能更进一步。我的问题是,如果没有解析器库,我不知道如何从这样的字符串创建Expr

import Control.Applicative (Alternative (empty, many, some, (<|>)), (<**>))
import Data.Char           (isSpace, isDigit)
import Data.Maybe          (listToMaybe)
现在我们可以继续使用该解析器,就像使用任何递归下降解析器一样:

data Expr = Val Integer
          | Expr :*: Expr
          | Expr :+: Expr
  deriving Show

parseVal :: Parser Expr
parseVal =
  char '(' *> parseAdd <* char ')' <|>
  Val . read <$> some (satisfy isDigit) <* eow

parseMul :: Parser Expr
parseMul = _

parseAdd :: Parser Expr
parseAdd = _

parseExpr :: Parser Expr
parseExpr = parseAdd <* eof
data Expr=Val整数
|Expr:*:Expr
|Expr:+:Expr
衍生节目
parseVal::Parser Expr
帕塞瓦尔=

char'('*>parseAdd为什么不想使用解析器库?因为我不允许使用它。这个家庭作业练习有什么限制?此时,你在问“如何编写解析器”,这对于一个如此宽泛的问题来说可能太宽泛了。当然,你的课程教给了你一些东西,可以大致指示你应该朝哪个方向前进?否则,这个问题就太宽泛了。
instance Functor Parser where
   fmap (Parser p) = _

instance Applicative Parser where
   pure a = Parser $ \s -> (a, s) -- Consumes nothing and returns a
   Parser pf <*> Parser pa = _    -- Parse pf, then parse pa and apply the result
                                  -- of pf to that of pa.

instance Alternative Parser where
   empty = Parser $ \s -> []   -- Matches nothing
   Parser p1 <|> Parser p2 = _ -- Matches either p1 or if that fails p2.

satisfy :: (Char -> Bool) -> Parser Char
satisfy = _

space :: Parser ()
space = () <$ satisfy isSpace

spaces :: Parser ()
spaces = () <$ many space

char :: Char -> Parser Char
char c = satisfy (c ==)

-- | Detects the end of file.
eof :: Parser ()
eof = _

-- | Succeeds when at the end of a word, without consuming any input
eow :: Parser ()
eow = _
data Expr = Val Integer
          | Expr :*: Expr
          | Expr :+: Expr
  deriving Show

parseVal :: Parser Expr
parseVal =
  char '(' *> parseAdd <* char ')' <|>
  Val . read <$> some (satisfy isDigit) <* eow

parseMul :: Parser Expr
parseMul = _

parseAdd :: Parser Expr
parseAdd = _

parseExpr :: Parser Expr
parseExpr = parseAdd <* eof