List.init(F#)的第二个参数需要澄清

  • 本文关键字:参数 第二个 init List list f#
  • 更新时间 :
  • 英文 :


你能解释一下List.init 中的第二个参数吗

let test2 = List.init 100000 (fun _ -> System.Random().Next(-50, 51));;

从List.init的声明中获取;我所理解的是init采用int和"一个采用索引并返回泛型值的函数"作为参数。返回值是传递的泛型类型的列表。

但我不明白这个函数是如何在给定的let绑定中应用的。

谢谢。

List.init取一个整数作为列表的大小,然后取一个用于填充每个元素的函数。此函数接受正在填充的元素的当前索引(即int(。列表中元素的类型取决于第二个函数的返回类型。在您的情况下是int

在问题中的示例中,函数fun _ -> System.Random().Next(-50, 51)将只选择随机值来填充列表。由于每次Random都是新的,你每次都会得到相同的值,因为计算机和随机性不是很熟悉。_在许多语言中都被用来表示我们不在乎参数的值,因为我们不会使用它。所以这里_被用作匿名泛型参数。

对于一个实际的"随机"值,您可以将Random()调用移动到函数外部并关闭它,或者从技术上讲,您可以使用项索引作为种子编号。我不建议这样做,但它确实说明了这一职能的作用。

let test1 = List.init 100000 (fun i -> System.Random(i).Next(-50, 51))

正如我所提到的,像这样的东西更有可能是你想要的:

//Random
let random = System.Random()
// int -> int 
let generate (_:int) = random.Next(-50, 51)//note this has the signature we need for the 2nd parameter of List.init
// generate the list
let test2 = List.init 10 generate;;

_也可以用于匹配。这里我们有一个元组,我们想要解构它以获得它的值。

let person = ("Bob","Builder")
let (firstname,lastname) = person
let (_,surname) = person

如果我们不在乎名字,我们不必得到它,但仍然可以使用相同的语法,我们只需要使用_来表示我们不在乎这个值。

参考符号和操作员参考

我想我现在明白了。fun _ -> System.Random().Next(-50, 51)是一个匿名函数,它使用_作为参数的通配符占位符,并返回一个随机数。

因此,它可以用作初始化的第二个参数,并返回随机生成的整数列表。

相关内容

最新更新