有没有像List.init,但形式“int - >'T - >'T列表”而不是?

时间:2011-08-14 11:29:55

标签: .net f#

我正在寻找一种方法来尝试简化以下表达式,看起来很难看,IMO:

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

我发现了List.init,但它仍然不是我想要的:

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

它是完美的,因为它不是lambda表达式的参数。这样做很完美:

List.init popSize generateIndividual()

F#库中有什么东西可以帮我清理它吗?

由于

6 个答案:

答案 0 :(得分:6)

由于unit(void)也是一种类型,你可以这样做:

List.init popSize (ignore >> generateIndividual)

答案 1 :(得分:5)

不是真的。最近的解决方案是改变generateIndividual函数的定义,使其接受任何类型的值(而不仅仅是类型unit的值)并丢弃它:

let generateIndividual _ = ...

然后你可以写:

List.init popSize generateIndividual

另一个解决方案是使用列表理解:

[for _ in 1..popSize -> generateIndividual()]

答案 2 :(得分:1)

这个怎么样?

let generateIndividual dummy = 4
let popSize = 10
let lst = List.init popSize generateIndividual

答案 3 :(得分:1)

您可以创建如下的扩展程序:

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

然后你可以这样称呼它:

List.init2 5 generateIndividual

答案 4 :(得分:1)

你可以这样做:

[ for i = 1 to popSize do 
      yield generateIndividual() ]

答案 5 :(得分:0)

我知道,迟到了,但是:

  1. 此解决方案尽可能短,
  2. 与ebb(你选择的)不同,这个会执行一次副作用:

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

  3. 类型正好是(int - >'a - >'列表),唯一的缺点是从Array转换为List,但这仍然比将Seq转换为List(这是什么)更好的性能由列表表达式完成。)