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

发布于 2024-10-06 03:06:28 字数 2318 浏览 0 评论 0原文

您好,我有以下代码

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 和有多少家喻户晓的名字?

编辑

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

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

Hi I have the following code

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)

And the compiler says that the following is not in scope "chain", "int" "number"

Why are the compiler complaining on these commands, isn't chain, int and number well known names?

EDIT

If you where to use the following parser, how would you solve the problem?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

薄情伤 2024-10-13 03:06:28

(您使用的是什么版本的秒差距?)

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

(What version of parsec are you using?)

There's no chain, int, or number provided by Parsec 2.x or Parsec 3.x, though these would be simple to write.

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

(Untested, and I'm just guessing at the intent of your code.)


Cute little parser combinator library there. Is this homework or something?

punva grez bc pbaf = cznc (sbyqe1 pbaf) $ grez <:> mrebBeZber (pune bc >-> grez)
vag = cznc ernq $ barBeZber qvtvg
天荒地未老 2024-10-13 03:06:28

看来您正在使用某种解析库,例如 Parsec 或 解析器模块 来自“Haskell 编程”。您需要导入您正在使用的那个。

It seems that you are using some sort of parsing library like Parsec, or the parser module from "programming in Haskell." You need to import the one you are using.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文