In Haskell, I can write:
token: Parser a -> Parser a
token p = do space
v <- p
space
return v
In F#, I have come this far:
let token = compose {
let! _ = space
let! v = parser
let! _ = space
return v
}
In other words, I have to introduce this unused let! _ =
binding to discard the parse value of "space" parser (monad), that I don't need.
How to avoid these useless bindings in F#? I have tried using do!, but I get an error (because my >>=
function does not take type unit but 'a):
let (>>=) (p: Parser<'a>) (f: 'a -> Parser<'b>) : Parser<'b>
Here is my builder definition:
type ParserComposer() =
member x.Bind(p, f) = p >>= f
member x.Return(y) = ret y
member x.Zero() = failure
Do I need to define >>
function? Add Combine() to builder? Any ideas how to do this right? Code example?