簡體   English   中英

如何正確丟棄F#中的(單峰)計算結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM