gpt4 book ai didi

f# - 让的机制!在计算表达式中

转载 作者:行者123 更新时间:2023-12-01 10:40:47 26 4
gpt4 key购买 nike

我目前正在研究神话般的 fsharpforfunandprofit 网站的计算表达式系列,我对计算系列的第 4 课“包装类型”有疑问。我尝试进一步阅读,但有一个重要概念我没有掌握。

其实我理解bind的定义:

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

但是我现在不明白的一件事是在 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 核心组件中的指令?谁能给我解释一下怎么让!从 wrapper 中取出 T'?

感谢您的解释

最佳答案

这个:

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

desugar 变成类似的东西(将 monad 类型命名为 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 好得多。 - 大多数支持某种单子(monad)表达式的语言都有类似的语法糖 - 甚至 C#(from ... in ... select 又名 LINQ)

关于f# - 让的机制!在计算表达式中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30321523/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com