Предположим, я хотел очистить веб-страницу и извлечь некоторые данные. Я бы скорее всего написал что-то вроде этого:
let getAllHyperlinks(url:string) =
async { let req = WebRequest.Create(url)
let! rsp = req.GetResponseAsync()
use stream = rsp.GetResponseStream() // depends on rsp
use reader = new System.IO.StreamReader(stream) // depends on stream
let! data = reader.AsyncReadToEnd() // depends on reader
return extractAllUrls(data) } // depends on data
let!
сообщает F # выполнить код в другом потоке, затем привязать результат к переменной и продолжить обработку. В приведенном выше примере используются два оператора let: один для получения ответа и один для чтения всех данных, поэтому он порождает по крайней мере два потока (пожалуйста, поправьте меня, если я ошибаюсь).
Хотя рабочий процесс выше порождает несколько потоков, порядок выполнения является последовательным, потому что каждый элемент в рабочем процессе зависит от предыдущего элемента. Невозможно оценить какие-либо элементы дальше по потоку, пока не вернутся другие потоки.
Есть ли какая-либо польза от наличия более чем одного let!
в коде выше?
Если нет, как этот код должен измениться, чтобы воспользоваться несколькими операторами let!
?