Допустим, я хотел почистить веб-страницу и извлечь некоторые данные. Скорее всего, я напишу что-то вроде этого:
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!
?