.net 是否有类似List.init的内容,但格式为;int->';T->';T列表“;相反
我正在寻找一种方法来简化下面这个看起来很难看的表达式:.net 是否有类似List.init的内容,但格式为;int->';T->';T列表“;相反,.net,f#,.net,F#,我正在寻找一种方法来简化下面这个看起来很难看的表达式: List.map (fun _ -> generateIndividual()) [1..popSize] 我找到了关于List.init,但它仍然不是我真正想要的: List.init popSize (fun x -> generateIndividual()) 如果没有lambda表达式的参数,那就太完美了。这样就完美了: List.init popSize generateIndividual() F#图书馆里有什
List.map (fun _ -> generateIndividual()) [1..popSize]
我找到了关于List.init
,但它仍然不是我真正想要的:
List.init popSize (fun x -> generateIndividual())
如果没有lambda表达式的参数,那就太完美了。这样就完美了:
List.init popSize generateIndividual()
F#图书馆里有什么可以帮我清理的吗
谢谢这个怎么样
let generateIndividual dummy = 4
let popSize = 10
let lst = List.init popSize generateIndividual
这个怎么样
let generateIndividual dummy = 4
let popSize = 10
let lst = List.init popSize generateIndividual
您可以创建如下扩展:
module List =
let init2 count f = List.init count (fun _ -> f())
List.init2 5 generateIndividual
你可以这样称呼它:
module List =
let init2 count f = List.init count (fun _ -> f())
List.init2 5 generateIndividual
您可以创建如下扩展:
module List =
let init2 count f = List.init count (fun _ -> f())
List.init2 5 generateIndividual
你可以这样称呼它:
module List =
let init2 count f = List.init count (fun _ -> f())
List.init2 5 generateIndividual
不是真的。最接近的解决方案是更改
generateIndividual
函数的定义,使其接受任何类型的值(而不仅仅是类型unit
的值)并丢弃它:
let generateIndividual _ = ...
然后你可以写:
List.init popSize generateIndividual
另一种解决方案是使用列表理解:
[for _ in 1..popSize -> generateIndividual()]
不是真的。最接近的解决方案是更改
generateIndividual
函数的定义,使其接受任何类型的值(而不仅仅是类型unit
的值)并丢弃它:
let generateIndividual _ = ...
然后你可以写:
List.init popSize generateIndividual
另一种解决方案是使用列表理解:
[for _ in 1..popSize -> generateIndividual()]
由于unit(void)也是一种类型,因此您可以执行以下操作:
List.init popSize (ignore >> generateIndividual)
由于unit(void)也是一种类型,因此您可以执行以下操作:
List.init popSize (ignore >> generateIndividual)
你可以做:
[ for i = 1 to popSize do
yield generateIndividual() ]
你可以做:
[ for i = 1 to popSize do
yield generateIndividual() ]
我知道,很晚了,但是:
(有趣的a->Array.create>>数组列表)
类型正好是(int->'a->'a list),唯一的缺点是从数组到列表的转换,但这在性能上仍然比将Seq转换为list(这是由列表表达式完成的)要好一些。我知道,很晚了,但是:
(有趣的a->Array.create>>数组列表)
类型正是(int->'a->'a list),唯一的缺点是从数组到列表的转换,但这在性能上仍然比将Seq转换为list(这是由列表表达式完成的)要好一些。只是澄清一下:您确实希望只调用一次
generateIndividual()
函数,对吗?否则,在严格的语言中,如果不将它包装到函数中,就不可能实现所需的功能。我希望为列表中的每个元素调用它(它将生成一个随机数!),那么您所需的功能就不可能实现。如果执行fx(g())
,g()
将被精确调用一次,无论f
是什么。这些只是语言的规则。使用init
和匿名函数的版本是最接近您所需的版本。我想知道您为什么会投反对票。。。我给了你一个投票来平衡它。只是为了澄清:你确实希望generateIndividual()
函数只被调用一次,对吗?否则,在严格的语言中,如果不将它包装到函数中,就不可能实现所需的功能。我希望为列表中的每个元素调用它(它将生成一个随机数!),那么您所需的功能就不可能实现。如果执行fx(g())
,g()
将被精确调用一次,无论f
是什么。这些只是语言的规则。使用init
和匿名函数的版本是最接近您所需的版本。我想知道您为什么会投反对票。。。我给了你一票来平衡。虽然我喜欢安克尔的答案,但我认为乔恩是个好答案。通过定义let generateIndividual=…,您仍然可以在代码generateIndividual()的其他地方这样调用它。如果您无法控制generateIndividual函数(它可能来自其他库)最好的选择是列表理解解决方案,通常比修改函数签名要好。虽然我喜欢Ankur的答案,但我认为Jon的答案是好的。通过定义let generateIndividual=…,您仍然可以在代码generateIndividual()的其他地方这样调用它。如果您无法控制generateIndividual函数(它可能来自其他库),那么最好的选择是列表理解解决方案,它通常比修改函数签名更好