需要haskell表达式的帮助(不在范围内编译器错误)
嗨,我有以下代码需要haskell表达式的帮助(不在范围内编译器错误),haskell,expression,ghci,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' +++
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不是很有名吗
编辑
如果您想知道在哪里使用下面的解析器,您将如何解决这个问题
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
模块解析
(语法分析器,语法分析器,
成功、失败、sat、pmap、字符、数字、,
(+++),(),(>*>),(>->-),(只是(a,s)
--解析任何单个字符
项目=P$\s->案例
[]->什么都没有
(c:cs)->只是(c,cs)
--(+++)使用p或使用q进行解析
infixr 5+++
(+++)::解析器a->解析器a->解析器a
p+++q=p$\s->listToMaybe[x | Just x*>f)使用p进行解析以生成a。
--然后使用fa进行解析
infixl 1>*>
(>*>)::解析器a->(a->解析器b)->解析器b
p>*>f=p$\s->
案例解析p-s
只是(a,s')->解析(fa)s'
_->没有
-----------------------------------------------
--pmap修改解析器的结果
pmap::(a->b)->解析器a->解析器b
pmap f p=p>*>success.f
p>->q=p>*>\\\->q——相当于一元运算:>>
p*>\a->q>->成功a
()::解析器a->解析器[a]->解析器[a]
p q=p>*>\a->pmap(a:)q
似乎您正在使用某种解析库,如Parsec,或“Haskell编程”中的。您需要导入您正在使用的库。(您使用的是什么版本的Parsec?)
Parsec2.x或Parsec3.x没有提供链
、int
、或number
,尽管这些都很容易编写
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
punva-grez-bc-pbaf=cznc(sbyqe1-pbaf)$grez-mrebBeZber(pune-bc>->grez)
vag=cznc ernq$barBeZber qvtvg
看起来您的缩进最后被破坏了。还有,这是Parsec代码吗?