gpt4 book ai didi

haskell - 了解 attoparsec 解析器 monad

转载 作者:行者123 更新时间:2023-12-04 14:33:22 24 4
gpt4 key购买 nike

我目前正在尝试研究 attoparsec 库的源代码,但现在我被 Parser 的 monad 定义困住了。参见 here.

instance Monad (Parser i) where

fail err = Parser $ \t pos more lose _succ -> lose t pos more [] msg
where msg = "Failed reading: " ++ err

return v = Parser $ \t pos more _lose succ -> succ t pos more v

m >>= k = Parser $ \t !pos more lose succ ->
let succ' t' !pos' more' a = runParser (k a) t' pos' more' lose succ
in runParser m t pos more lose succ'

尤其是,我很难理解 (>>=) 运算符的定义。例如在表达式 let succ' t' !pos' more' a = runParser (k a) t' pos' more' lose succ: 参数在哪里 pos't' 来自??

也许我现在太糊涂了,看不到明显的东西,所以如果有人能解释 Parser 类型的 monad 定义以帮助我更好地理解它,我将不胜感激...

提前致谢!

最佳答案

这是定义一个函数succ':

succ' :: Success i (State i) a r
succ' t' !pos' more' a = runParser (k a) t' pos' more' lose succ

-- type Success i t a r = t -> Pos -> More -> a -> IResult i r
-- t' :: t
-- pos' :: Pos
-- more' :: More
-- a :: a
-- runParser (k a) t' pos' more' lose succ :: IResult i r

没什么特别的,它只是一个局部函数定义。然后,此函数作为最后一个参数传递给 runParser

关于haskell - 了解 attoparsec 解析器 monad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27359982/

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