我想知道是否有办法在Parsec停止解析后从Parsec获得剩余输入,无论是成功还是失败的解析,也许这个签名:
parseRemaining :: Stream s Identity t => Parsec s () a -> SourceName -> s -> (s, Either ParseError a)
Run Code Online (Sandbox Code Playgroud)
我们得到的不是一个Either ParseError a,我们另外得到剩下的Stream s
我有以下代码
type Position = (Int,Int)
data CheckError where
LError :: Position -> LexerError -> CheckError
PError :: Position -> ParseError -> CheckError
SError :: Position -> StaticError -> CheckError
Run Code Online (Sandbox Code Playgroud)
我需要它来实例,Ord但只需比较Position每个构造函数中的字段.
我得到了这个:
data CheckError where
LError :: Position -> LexerError -> CheckError
PError :: Position -> ParseError -> CheckError
SError :: Position -> StaticError -> CheckError
deriving (Show)
instance Eq CheckError where
(LError l _) == (LError r _) = l == r
(LError l _) == …Run Code Online (Sandbox Code Playgroud) 我怀疑为什么Haskell无法处理以下行
Prelude> take 1000000000000 $ repeat ' '
Run Code Online (Sandbox Code Playgroud)
该行代码将返回:
""
Run Code Online (Sandbox Code Playgroud)
这显然不是1,000,000,000,000个空间.
如果我尝试少于零,它会打印很长时间.
最困扰我的是,如果我只是写作
Prelude> repeat ' '
Run Code Online (Sandbox Code Playgroud)
它会工作,即使是一个很大多个零的.
那么,为什么Haskell不能像repeat单独使用那样打印很长时间?
我需要为数据派生Eq,但对于某些构造函数,我想忽略一些字段.数据用于表示DataTypes(我们正在开发编译器):
data DataType
= Int | Float | Bool | Char | Range | Type
| String Width
| Record (Lexeme Identifier) (Seq Field) Width
| Union (Lexeme Identifier) (Seq Field) Width
| Array (Lexeme DataType) (Lexeme Expression) Width
| UserDef (Lexeme Identifier)
| Void | TypeError
deriving (Ord)
Run Code Online (Sandbox Code Playgroud)
我需要忽略它出现的每个contstructor中的Width 字段.