Просто для предоставления дополнительной информации, которая может объяснить, что здесь происходит - в 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 ]
Это шаблон, который часто встречается в списках, поэтому полезно знать об этом: -).