Просто чтобы предоставить некоторую дополнительную информацию, которая может объяснить, что здесь происходит - есть два способа создания списков в F#, и в обоих случаях вы пишете что-то в квадратных скобках [ ... ]
(что может быть немного запутанно поначалу!)
Литералы списков используются, когда у вас есть несколько выражений (известное количество явно написанных выражений) и вы хотите создать список, содержащий результаты оценки этих выражений. Например:
[ 1; 2; 3; ] // list of constant expressions
[ 1+1; 2+2; 3+3 ] // creates list [ 2; 4; 6 ]
Списковые включения используются, когда у вас есть код, который что-то делает и генерирует список элементов (путем создания элементов во время вычисления). Это то, что Инь Чжу использует в своем ответе. Некоторые примеры:
[ yield 1; ] // generates singleton list [ 1 ]
[ yield 1; yield 2; ] // generates list with two elements
[ for x in 1 .. 10 do // iterates loop 10 times
yield x * x ] // ... generates element during every iteration
Расширенные функции
Вы также можете использовать yield!
для одновременного создания нескольких элементов:
[ yield! [ 1; 2 ] // generates a list containing [ 1; 2; 3; 4 ]
yield! [ 3; 4 ] ]
Это можно использовать для написания рекурсивных функций, поэтому вы можете переписать свой код, используя рекурсию вместо цикла (это было бы полезно, если бы вам нужно было сохранить какое-то состояние, но, как сейчас выглядит ваш код, while
прекрасно!)
let rec loop reader =
[ if reader.Read() then
yield new CityType(Id=(reader.GetInt32 0), Name=(reader.GetString 1),
StateName=(reader.GetString 2))
yield! loop reader ]
Это шаблон, который часто появляется в списках, так что знать о нем полезно :-).
person
Tomas Petricek
schedule
24.05.2010