需要有关haskell表达式的帮助(不在范围编译器错误中)

时间:2010-12-05 15:30:54

标签: haskell expression ghci

您好我有以下代码

expression :: String →  Maybe Expr
expression s =   case parse expr s' of
      Just (a,"") →  Just a
      _           →  Nothing
    where s' = filter (λx →  x ≠ ' ') s

expr, term, factor, num, sin', cos' :: Parser Expr
num    = dbl' +++ int'

expr   = chain term '+' Add

term   = chain factor '*' Mul



func = sin' +++ cos'

var' = do
       char 'x'
       return (Var "x")

int' = do n ←  int
          return (Num (fromIntegral n))

dbl' = do n ←  int
   char '.'
   n' ←  oneOrMore number
   let c = ((show n) ⊕ "." ⊕ n')
   return (Dbl (read c))

sin' = do char 's'
   char 'i'
          char 'n'
   e ←  factor
          return (Sin e)

并且编译器说以下不在范围“chain”,“int”“number”

为什么编译器抱怨这些命令,不是chain,int和number众所周知的名字?

修改

如果您在哪里使用以下解析器,您将如何解决问题?

module Parsing
 ( Parser,parse,
  success,failure,sat,pmap,char,digit,
  (+++),(<:>),(>*>),(>->),(<-<),
  oneOrMore,zeroOrMore
 )

where

import Data.Maybe
import Data.Char

------------------



-------------------
-- Basic Parsers, dependent on internal structure --
-- success and fail
failure    = P $ \s -> Nothing
success a  = P $ \s -> Just (a,s)

-- Parse any single character
item  =  P $ \s -> case s of
               []     -> Nothing
               (c:cs) -> Just (c,cs)

-- (+++)  parse either using p or else using q
infixr 5 +++
(+++) :: Parser a -> Parser a -> Parser a

p +++ q  = P $ \s -> listToMaybe [ x | Just x <- [parse p s, parse q s]]

-- (p >*> f) parse using p to produce a.
-- Then parse using f a

infixl 1 >*>

(>*>) :: Parser a -> (a -> Parser b) -> Parser b

p >*> f  = P $ \s ->
            case parse p s of
                    Just(a,s') -> parse (f a) s'
                    _          -> Nothing

-----------------------------------------------


-- pmap modifies the result of a parser
pmap :: (a -> b) -> Parser a -> Parser b
pmap f p = p >*> success . f

p >-> q = p >*> \_ -> q  -- equivalent to monadic op: >>
p <-< q = p >*> \a -> q >-> success a


(<:>):: Parser a -> Parser [a] -> Parser [a]
p <:> q = p >*> \a -> pmap (a:) q

2 个答案:

答案 0 :(得分:1)

(您使用的是什么版本的parsec?)

Parsec 2.x或Parsec 3.x提供的chainintnumber没有,但这些内容很简单。

chain term op cons = sepBy1 expr (char op) >>= return . foldr1 cons
int = many1 digit >>= return . read
number = digit

(未经测试,我只是猜测你的代码的意图。)


那里有可爱的小解析器组合库。这是家庭作业吗?

punva grez bc pbaf = cznc (sbyqe1 pbaf) $ grez <:> mrebBeZber (pune bc >-> grez)
vag = cznc ernq $ barBeZber qvtvg

答案 1 :(得分:0)

您似乎正在使用某种类似Parsec的解析库,或者来自“Haskell中的编程”的parser module。您需要导入正在使用的那个。