В настоящее время я работаю над серией вычислительных выражений на потрясающем веб-сайте 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? Может ли кто-нибудь объяснить мне, как пусть! достать букву Т из обертки?
Спасибо за ваши объяснения
Bind
используется (разворачивание): вы можете думать оlet! custId = ...
как о простоBind (getCustomerId "Alice") (fun custId -> ... the next line(s))
, поэтому каждыйlet!
даст вам еще один уровеньBind
- person Random Dev   schedule 19.05.2015let!
сам по себе является синтаксическим сахаром, который нужно связывать десахаром - вы можете найти некоторые подробности в этом сообщение от Дона - person Random Dev   schedule 19.05.2015