F # — создание 100 объектов в список — наиболее функциональный и идиоматичный способ

#.net #f# #functional-programming #idioms

#.net #f# #функциональное программирование #идиомы

Вопрос:

Какой наиболее функциональный и идиоматичный способ создания или «обновления» 100 новых объектов в списке в F #?

Я думаю, для примера мы могли бы использовать DateTime в качестве примера объекта.

Комментарии:

1. в схеме мы только что сделали (и я устал от этого): объявить список приложений, который нужно добавить (if (> x 0) (список приложений (добавление списка минусов) (- xtogo 1) append) (список))

Ответ №1:

 List.init 100 (fun x -> x * 2)
  

Комментарии:

1. Неплохо. Спасибо. List.init 100 (fun x -> новая система. DateTime())

2. Возможно, даже немного более идиоматичный (и более короткий): List.init 100 (fun _ -> DateTime())

Ответ №2:

Альтернативно, как выражение списка:

 [for i in 1..100 -> new System.DateTime()]
  

Но я думаю, что это менее идиоматично.

Комментарии:

1. @Ingo: В F # у вас есть «последовательности» для подобных вещей. (Seq.initInfinite id) например, неотрицательные целые числа.

2. @Ingo: В F # есть List.replicate , Seq.take , Seq.iter и так далее. F # также обладает некоторыми приятными преимуществами, такими как List.ofArray отсутствие переполнения стека, как getElems в Haskell. Ну что ж…

Ответ №3:

Я бы рассмотрел возможность использования

 [|for i in 1..100 -> new System.DateTime() |]
  

поскольку вы работаете с изменяемыми данными.

Комментарии:

1. С каких это DateTime пор он стал изменяемым?

2. Да, я только что попытался отклонить свой ответ. Не могу вспомнить, была ли это структура или класс. Вероятно, в любом случае следует просто использовать float.

3. Использовать ли неизменяемую или изменяемую коллекцию (например, массив), на самом деле не зависит от изменяемости типа элемента. Совершенно нормально иметь массив неизменяемого типа. — Однако нужно быть осторожным с отсортированной коллекцией, подобной Map . Изменение изменяемого ключевого элемента Map , безусловно, плохая идея.

4. @Brent, ты рассмешил меня «просто пытался отклонить мой ответ». КСТАТИ, DateTime — это struct / ValueType. И я не понимаю, что вы имеете в виду, говоря о числах с плавающей точкой.

5. Вы только что создали массив, а не список. не так ли?