안녕이는 (안 범위 컴파일러 오류) 하스켈의 발현과 관련하여 도움이 필요
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)
그리고 컴파일러가 다음 번호 ""체인 ","INT "범위에없는 것을 말한다 다음 코드 "
컴파일러가 이러한 명령에 대해 불평하는 이유는 체인, 정수 및 번호가 잘 알려진 이름이 아닙니까? 어디 다음 파서를 사용하는 경우
는, 당신은 어떻게이 문제를 해결할 EDIT?
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
들여 쓰기가 끝난 것 같습니다. 또한,이 Parsec 코드가 무엇입니까? – delnan