[英]How to correctly discard result of a (monadic) computation in F#
在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! _ =
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()添加到生成器? 任何想法如何正確執行此操作? 代碼示例?
假設space
的返回類型是Parser<unit>
(如果它不代表返回某些結果的解析器,則很有意義),您可以編寫:
let token = compose {
do! space
let! v = parser
do! space
return v
}
這只是您編寫內容的語法糖-這樣do! e
do! e
被翻譯為let! _ = e
let! _ = e
,然后將其翻譯為parser.Bind(e, fun _ -> ...)
。 我在Try Joinads上有一個用於加法解析器的示例,該示例還定義了Combine
和更多(可能)有用的東西,但是do!
關鍵字只需要Bind
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.