3

私は現在、素晴らしい fsharpforfunandprofit Web サイトの計算式シリーズに取り組んでおり、計算シリーズのレッスン 4「ラップされた型」に関して質問があります。もう少し読んでみましたが、把握していない重要な概念があります。

実際、私は bind の定義を理解しています:

member Bind : M<'T> * ('T -> M<'U>) -> M<'U>

しかし、この時点で理解できないことの 1 つは、let! を使用した計算式で使用するときの魔法です。

たとえば、次のようになります。

let product'' = 
    dbresult {
        let! custId = getCustomerId "Alice"
        let! orderId = getLastOrderForCustomer "" // error!
        let! productId = getLastProductForOrder orderId 
        printfn "Product is %s" productId
        return productId
        }
printfn "%A" product''

getCustomerId "Alice"はM<'T>を返してくれますが、custId は既にラップされていない 'Tであり、この魔法のトリックがどのように機能するかはどこにもわかりません...

let に隠されたコードの一部ですか! Fsharpコアアセンブリ内の命令?誰かが私にどのようにさせてくれるのか説明してもらえますか! ラッパーから T' を取り出しますか?

ご説明ありがとうございます

4

1 に答える 1

6

これ:

let product'' = 
    dbresult {
        let! custId = getCustomerId "Alice"
        let! orderId = getLastOrderForCustomer "" // error!
        let! productId = getLastProductForOrder orderId 
        printfn "Product is %s" productId
        return productId
        }

次のようなものにdesugarします (モナド型を単に と名付けますDB<'t>):

let product'' = 
   DB.Delay(fun () ->
       DB.Bind(getCustomerId "Alice",(fun custId ->
          DB.Bind(getLastOrderForCustomer "",(fun orderId ->
             DB.Bind(getLastProductForOrder orderId, (fun productId ->
                printfn "Product is %s" productId
                DB.Return productId)))))))

したがって、基本的にBindはそれぞれのレベルを取得しますlet!(通常は無視できますDelay

ご覧のとおり、計算式の構文はネストされたものよりもはるかに優れてBindsいます-何らかの種類のモナド式をサポートするほとんどの言語には、同様の構文糖衣があります-C#(from ... in ... select別名LINQ)でさえ

于 2015-05-19T09:36:07.827 に答える