Я заметил, что следующий код дает ошибку при попытке скомпилировать его:
let xx =
seq {
let! i = [ 1; 2 ]
let! j = [ 3; 4 ]
yield (i,j)
}
Ошибка: "Ошибка FS0795: использование" let! x = coll "в выражениях последовательности больше не разрешено. Вместо этого используйте" для x в coll ". Это сообщение, конечно, понятно и демонстрирует, как его исправить; фиксированный код:
let xx =
seq {
for i in [ 1; 2 ] do
for j in [ 3; 4 ] do
yield (i,j)
}
Мой вопрос заключается не в том, как это исправить, но почему "пусть!" не допускается в выражениях последовательности в первую очередь? Я вижу, как тот факт, что пусть! итерации над выражением могут стать неожиданностью для некоторых, но этого недостаточно, чтобы запретить конструкцию. Я также вижу, как "для" здесь более сильная, так как версия с "let!" испекает в рамках итерации как "до конца выражения последовательности".
Однако возможность перебора последовательности без кода отступа была именно тем, что я искал (для пересечения древовидных структур). Я предполагаю, что для получения этой семантики мне придется создать новый конструктор выражений, который действует в основном как построитель выражений "seq", но позволяет "let!" для итерации, не так ли?
Добавлено, основываясь на комментарии Брайана ниже, предоставляя решение моей основной проблемы:
Я не понял, что отступы в блоках не нужны, а второй образец можно переписать как:
let xx =
seq {
for i in [ 1; 2 ] do
for j in [ 3; 4 ] do
yield (i,j)
}
..., который избавляется от постоянно увеличивающегося отступа при пересечении древовидной структуры. Синтаксис даже позволяет добавлять дополнительные инструкции для операторов без необходимости дополнительного отступа, как в:
let yy =
seq {
for i in [ 1; 2 ] do
let i42 = i+42
for j in [ 3; 4 ] do
yield (i42,j)
}
Теперь, если бы я мог понять, почему я думал, что эти утверждения потребуют отступов...