В Haskell, я могу написать:Как правильно сбросить результат (монадической) вычисления в F #
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! _ =
, чтобы отбросить значение синтаксиса анализатора пространства (монады), которое мне не нужно.
Как избежать этих бесполезных привязок в F #? Я попытался с помощью делать !, но я получаю сообщение об ошибке (потому что моя >>=
функция не принимает блок типа, а «а):
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() в конструктор? Любые идеи, как это сделать правильно? Пример кода?
Вы можете определить '>>', но с другим именем, поскольку оно уже является стандартным оператором. Пример: https://github.com/fsharp/fsharpx/blob/9ad7ff3024b1cc90fd252520272421920c1f4017/src/FSharpx.Core/ComputExpressions/Monad.fs#L779 –
Хорошо, и когда я определил >> под другим именем, что мне делать ? – badbadboy
Вы используете его так же, как и в Haskell. Или используйте 'let! _ = ... ' –