我正在寻找一种方法来尝试简化以下表达式,看起来很难看,IMO:
List.map (fun _ -> generateIndividual()) [1..popSize]
我发现了List.init
,但它仍然不是我想要的:
List.init popSize (fun x -> generateIndividual())
它是完美的,因为它不是lambda表达式的参数。这样做很完美:
List.init popSize generateIndividual()
F#库中有什么东西可以帮我清理它吗?
由于
答案 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)
我知道,迟到了,但是:
与ebb(你选择的)不同,这个会执行一次副作用:
(fun a -> Array.create a >> List.ofArray)
类型正好是(int - >'a - >'列表),唯一的缺点是从Array转换为List,但这仍然比将Seq转换为List(这是什么)更好的性能由列表表达式完成。)