小编cha*_*ni2的帖子

得到Parsec的左输入

我想知道是否有办法在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

haskell parsec

5
推荐指数
1
解决办法
300
查看次数

根据数据的特定部分派生实例

我有以下代码

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

3
推荐指数
1
解决办法
101
查看次数

为什么`take`返回大数[],即使列表是无限的?

我怀疑为什么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单独使用那样打印很长时间?

haskell lazy-evaluation

2
推荐指数
1
解决办法
147
查看次数

使用构造函数的一部分来导出Haskell数据中的实例

我需要为数据派生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 字段.

compiler-construction haskell derived-instances

1
推荐指数
2
解决办法
219
查看次数