parsing - 为什么解析器组合器 "seq"是用 "bind"和 "return"定义的?

标签 parsing haskell functional-programming

我正在读这个article关于解析器组合器,不理解以下内容:

他们说使用 seq(见下文)会导致解析器将嵌套元组作为结果,操作起来很麻烦

 seq :: Parser a -> Parser b -> Parser (a,b)
 p ‘seq‘ q = \inp -> [((v,w),inp’’) | (v,inp’) <- p inp, (w,inp’’) <- q inp’]

为了避免这种嵌套元组的问题,他们为解析器引入了monadic bindreturn 然后定义seq如下:

 p ‘seq‘ q = p ‘bind‘ \x -> q ‘bind‘ \y -> result (x,y)

不幸的是,我不明白嵌套元组的问题是什么以及为什么 seq 的第二个实现比第一个更好。你能帮我理解一下吗?

最佳答案

第一个例子扩展到类型((a,b),(c,d,e)):

seq232 ((p,q),(r,s,t) = \inp ->
     [ (((v,w),(x,y,z)),inp’’''')
     | (v, inp’) <- p inp
     , (w, inp’’) <- q inp’
     , (x, inp''') <- r inp''
     , (y, inp'''') <- s inp'''
     , (z, inp''''') <- t imp''''
     ]

第二个例子扩展到类型((a,b),(c,d,e)):

seq232 ((p,q),(r,s,t)) =
    p ‘bind‘ \v ->
    q ‘bind‘ \w ->
    r `bind` \x ->
    s `bind` \y ->
    t `bind` \z ->
    result ((v,w),(x,y,z))

虽然它不是更好很多,但我认为您可以看到第二个更干净一些。

关于parsing - 为什么解析器组合器 "seq"是用 "bind"和 "return"定义的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25080979/

相关文章:

ODBC 中的 Haskell Unicode 列名

haskell - 有没有什么方法可以限制ADT数据,使得只有有效的数据才能被构造?

testing - Grails 功能测试依赖注入(inject)

ruby - Ruby 中的 Monad 等价物

windows - Win32 : How to convert string to a date?

debugging - "No operation" haskell

java - 解析数据字符串的正确方法

java - BinaryOperator 的身份

python - 解析数据框中两种不同格式的日期

parsing - 用于编写解析器生成器的在线资源