gpt4 book ai didi

haskell - Parsec 函数 'parse' 和类 'Stream' 的类型签名

转载 作者:行者123 更新时间:2023-12-01 16:51:28 25 4
gpt4 key购买 nike

下面的类型声明中的约束(Stream s Identity t)是什么意思?

parse :: (Stream s Identity t)
=> Parsec s () a -> SourceName -> s -> Either ParseError a

下面的类声明中的Stream是什么,代表什么意思。我完全迷路了。

class Monad m => Stream s m t | s -> t where

当我使用 Parsec 时,我总是陷入类型签名 (xxx::yyy) 的困境。我总是跳过签名,将 src 加载到 ghci,然后将类型签名复制回我的 .hs 文件。它有效,但我仍然不明白所有这些签名是什么。

<小时/>

编辑:更多关于我的问题的要点。

我仍然对类型签名的“上下文”感到困惑:

(Show a) =>

表示a必须是类Show的实例。

(Stream s Identity t) => 

这个“上下文”的含义是什么,因为 t 从未在 => 之后显示

<小时/>

我有很多不同的解析器要运行,所以我编写了一个扭曲函数来使用真实文件运行任何这些解析器。但问题来了:

这是我的代码,无法加载,我该如何让它工作?

module RunParse where
import System.IO
import Data.Functor.Identity (Identity)
import Text.Parsec.Prim (Parsec, parse, Stream)

--what should I write "runIOParse :: ..."
--runIOParse :: (Stream s Identity t, Show a) => Parsec s () a -> String -> IO ()
runIOParse pa filename =
do
inh <- openFile filename ReadMode
outh <- openFile (filename ++ ".parseout") WriteMode
instr <- hGetContents inh
let result = show $ parse pa filename instr
hPutStr outh result
hClose inh
hClose outh

最佳答案

the constraint: (Stream s Identity t) means what?

这意味着解析器所处理的输入s(即[Char])必须是Stream类的实例。在 documentation您会看到 [Char] 确实是 Stream 的一个实例,因为任何列表都是。

参数t是 token 类型,通常是Char并且由s确定,如下说明函数依赖s -> t

但是不要太担心这个 Stream 类型类。它仅用于为任何类似 Stream 的类型提供统一的接口(interface),例如列表或字节串。

what is Stream

Stream 只是一个类型类。它具有 uncons 函数,该函数返回输入的头部和包含在 Maybe 中的元组中的尾部。通常你不需要这个功能。据我所知,只有像 tokenPrimEx 这样的最基本的解析器才需要它。

编辑:

what's the meaning of this 'context', since t never showed after the =>

看看functional dependenciest 永远不会显示在 ´=>´ 之后,因为它是由 s 决定的。这意味着您可以在任何 s 上使用 uncons

Here is my code, It cannot be loaded, how can I make it work?

简单:为 Text.Parsec.String 添加导入语句,该语句定义 Stream [tok] m tok 缺少的实例。这里的文档可能会更清晰一些,因为看起来这个实例是在 Text.Parsec.Prim 中定义的。

或者导入整个 Parsec 库 (import Text.Parsec) - 这就是我总是这样做的。

关于haskell - Parsec 函数 'parse' 和类 'Stream' 的类型签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6370094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com