在 Haskell 中,我可以写:
token: Parser a -> Parser a
token p = do space
v <- p
space
return v
在 F# 中,我已经走到了这一步:
let token = compose {
let! _ = space
let! v = parser
let! _ = space
return v
}
换句话说,我必须引入这个未使用let! _ =
的绑定来丢弃我不需要的“空间”解析器(monad)的解析值。
如何在 F# 中避免这些无用的绑定?我曾尝试使用 do!,但出现错误(因为我的>>=
函数不采用类型单位,而是采用 'a):
let (>>=) (p: Parser<'a>) (f: 'a -> Parser<'b>) : Parser<'b>
这是我的构建器定义:
type ParserComposer() =
member x.Bind(p, f) = p >>= f
member x.Return(y) = ret y
member x.Zero() = failure
我需要定义>>
功能吗?将 Combine() 添加到构建器?任何想法如何正确地做到这一点?代码示例?