Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 是否有类似List.init的内容,但格式为;int->';T->';T列表“;相反_.net_F# - Fatal编程技术网

.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() ]

我知道,很晚了,但是:

  • 这个解决方案尽可能短
  • 与ebb’s(您选择的)不同,该产品会产生一次副作用:

    (有趣的a->Array.create>>数组列表)


  • 类型正好是(int->'a->'a list),唯一的缺点是从数组到列表的转换,但这在性能上仍然比将Seq转换为list(这是由列表表达式完成的)要好一些。

    我知道,很晚了,但是:

  • 这个解决方案尽可能短
  • 与ebb’s(您选择的)不同,该产品会产生一次副作用:

    (有趣的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函数(它可能来自其他库),那么最好的选择是列表理解解决方案,它通常比修改函数签名更好