Есть ли что-то вроде List.init, но вместо этого в форме "int -> 'T ->' T list"? - PullRequest
1 голос
/ 14 августа 2011

Я ищу способ попытаться упростить следующее выражение, которое выглядит некрасиво, ИМО:

List.map (fun _ -> generateIndividual()) [1..popSize]

Я нашел около List.init, но на самом деле это не то, что я ищу:

List.init popSize (fun x -> generateIndividual())

Было бы прекрасно, если бы не аргумент к лямбда-выражению. Было бы идеально так:

List.init popSize generateIndividual()

Есть ли в библиотеке F # что-то, что помогло бы мне это исправить?

Спасибо

Ответы [ 6 ]

6 голосов
/ 14 августа 2011

Благодаря тому, что unit (void) также является типом, вы можете сделать это:

List.init popSize (ignore >> generateIndividual)
5 голосов
/ 14 августа 2011

Не совсем. Ближайшим решением было бы изменить определение вашей функции generateIndividual, чтобы она принимала значение любого типа (а не только значение типа unit) и отбрасывала его:

let generateIndividual _ = ...

Тогда вы могли бы написать:

List.init popSize generateIndividual

Другое решение заключается в использовании списочного понимания:

* * 1010
1 голос
/ 14 августа 2011

Вы можете сделать:

[ for i = 1 to popSize do 
      yield generateIndividual() ]
1 голос
/ 14 августа 2011

Вы можете создать расширение следующим образом:

module List =
    let init2 count f = List.init count (fun _ -> f())

Затем вы можете назвать это так:

List.init2 5 generateIndividual
1 голос
/ 14 августа 2011

Как насчет этого?

let generateIndividual dummy = 4
let popSize = 10
let lst = List.init popSize generateIndividual
0 голосов
/ 15 августа 2011

Я знаю, поздно и все, но:

  1. Это решение настолько короткое, насколько вы получите,
  2. В отличие от отливов (которые вы выбрали), он будет выполнять побочные эффекты один раз:

    (fun a -> Array.create a >> List.ofArray)

Тип точно (int -> 'a ->' список), только недостатокэто преобразование из массива в список, но это все же немного лучше с точки зрения производительности, чем преобразование Seq в список (что и делается с помощью выражений списка).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...