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
Haskell 帕塞克唐';即使解析失败,也不要转到左边_Haskell_Parsec - Fatal编程技术网

Haskell 帕塞克唐';即使解析失败,也不要转到左边

Haskell 帕塞克唐';即使解析失败,也不要转到左边,haskell,parsec,Haskell,Parsec,我正在用这个例子学习parsec 随着代码的崩溃,结果总是“正确的” 有人能给我一些建议吗 *Main> regularParse parser4search "a" Loading package array-0.5.0.0 ... linking ... done. Loading package deepseq-1.3.0.2 ... linking ... done. Loading package bytestring-0.10.4.0 ... linking ..

我正在用这个例子学习parsec

随着代码的崩溃,结果总是“正确的”

有人能给我一些建议吗

*Main> regularParse  parser4search "a"  
Loading package array-0.5.0.0 ... linking ... done.  
Loading package deepseq-1.3.0.2 ... linking ... done.  
Loading package bytestring-0.10.4.0 ... linking ... done.  
Loading package text-1.1.0.0 ... linking ... done.  
Loading package transformers-0.3.0.0 ... linking ... done.  
Loading package mtl-2.1.3.1 ... linking ... done.  
Loading package parsec-3.1.7 ... linking ... done.  
Right (Num *** Exception: Prelude.read: no parse  
*Main> regularParse  parser4search "1"  
Right (Num 1)  
==========

import Text.Parsec (parse,anyChar)
import Text.Parsec.String --(Parser)
import Text.Parsec.Char (oneOf, char, digit, satisfy,letter)
import Text.Parsec.Combinator (many1, choice, chainl1)
import Control.Applicative ((<|>), many)
import Control.Monad --(void)
import Data.Char --(isLetter, isDigit)


data SimpleExpr = Num Integer
             | Var String
             | Add SimpleExpr SimpleExpr
             | Parens SimpleExpr
             | Str [Char]
               deriving (Eq,Show)

regularParse p = parse p ""

parser4search:: Parser SimpleExpr
parser4search = do
    searchStr <- many digit
    return (Num (read searchStr))
import Text.Parsec(parse,anyChar)
导入Text.Parsec.String--(解析器)
导入Text.Parsec.Char(一个,字符,数字,满足,字母)
导入Text.Parsec.Combinator(many1,choice,chainl1)
导入控件。应用程序((),多个)
导入控制.Monad--(void)
导入数据.Char--(Isleter,isDigit)
数据SimpleExpr=Num整数
|变量字符串
|添加SimpleExpr SimpleExpr
|帕伦斯单纯形
|Str[Char]
推导(等式,显示)
regularParse p=parse p“”
parser4search::Parser SimpleExpr
parser4search=do

searchStrparsec没有给出错误(左值),因为解析“a”时没有错误。
many digit
语句在未找到任何整数字符的情况下返回空字符串。 要使代码正常工作,需要处理空字符串。 例如

parser4search::Parser SimpleExpr
parser4search=do

searchStrparsec没有给出错误(左值),因为解析“a”时没有错误。
many digit
语句在未找到任何整数字符的情况下返回空字符串。 要使代码正常工作,需要处理空字符串。 例如

parser4search::Parser SimpleExpr
parser4search=do

searchStr
many
表示解析零个或多个项目

many1
表示解析一个或多个项目

因此,
多位数
成功输入“1”、“24”或“”

many1
在输入“1”、“24”时成功,但在输入“”时失败。听起来这就是你想要的


您可能还想查看
eof
,这样就不允许使用未解析的尾部内容。

many
表示解析零个或多个项目

many1
表示解析一个或多个项目

因此,
多位数
成功输入“1”、“24”或“”

many1
在输入“1”、“24”时成功,但在输入“”时失败。听起来这就是你想要的

您可能还想查看
eof
,这样就不允许使用未解析的尾随内容

parser4search:: Parser SimpleExpr
parser4search = do
    searchStr <- many digit
    if searchStr == [] 
    then return (Num 0) 
    else return (Num (read searchStr))