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

时间:2018-07-27 00:28:35

标签: list f#

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

Shuffle()

从List.init available here的声明开始;据我了解,init接受一个let test2 = List.init 100000 (fun _ -> System.Random().Next(-50, 51));;和“一个接受索引并返回通用值的函数”作为参数。返回值是传递的通用类型的列表。

但是我不明白如何在给定的int绑定中应用该函数。

谢谢。

2 个答案:

答案 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

如果我们不在乎名字,我们不必获取名字,但是仍然可以使用相同的语法,我们只使用_来表示我们不在乎该值。

引用Symbol and Operator reference

答案 1 :(得分:1)

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

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