您能解释一下List.init中的第二个参数吗?
Shuffle()
从List.init available here的声明开始;据我了解,init接受一个let test2 = List.init 100000 (fun _ -> System.Random().Next(-50, 51));;
和“一个接受索引并返回通用值的函数”作为参数。返回值是传递的通用类型的列表。
但是我不明白如何在给定的int
绑定中应用该函数。
谢谢。
答案 0 :(得分:3)
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
如果我们不在乎名字,我们不必获取名字,但是仍然可以使用相同的语法,我们只使用_
来表示我们不在乎该值。
答案 1 :(得分:1)
我想我现在明白了。 fun _ -> System.Random().Next(-50, 51)
是一个匿名函数,它使用_作为参数的通配符占位符,并返回一个随机数。
因此,它可用作初始化的第二个参数,并获取随机生成的整数的列表。