你能解释一下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)
是一个匿名函数,它使用_作为参数的通配符占位符,并返回一个随机数。
因此,它可以用作初始化的第二个参数,并返回随机生成的整数列表。