Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/85.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
List F#列表的不可变版本<;T>;?_List_F#_Immutability - Fatal编程技术网

List F#列表的不可变版本<;T>;?

List F#列表的不可变版本<;T>;?,list,f#,immutability,List,F#,Immutability,我现在正试着学一点F#来取乐 在C#中,我处理来自数据库的复杂数据,这些数据通常必须在一个元素中包含int、double和string。System.Collections.Generic列表非常适合于此 我试图探索F#中的并行性,但需要一个不可变的列表来实现。这可能吗?语法是否类似于C#var x=newlist 谢谢 我将对其进行编辑,使其更加清晰: 在F#中,我想创建一个不可变的类或记录列表(应该命名),就像在C#with list中一样。这样我就可以在同一个元素中使用分组字符串、整数和d

我现在正试着学一点F#来取乐

在C#中,我处理来自数据库的复杂数据,这些数据通常必须在一个元素中包含int、double和string。
System.Collections.Generic列表
非常适合于此

我试图探索F#中的并行性,但需要一个不可变的
列表来实现。这可能吗?语法是否类似于C#
var x=newlist

谢谢

我将对其进行编辑,使其更加清晰:

在F#中,我想创建一个不可变的类或记录列表(应该命名),就像在C#with list中一样。这样我就可以在同一个元素中使用分组字符串、整数和double。希望这真的很简单。

您可以查看

您可以退房


我认为,在这个问题的背景下,应该说明F#immutable structures对您的帮助不大,因为如果您按照其他答案中的描述创建不可变F#list,您只能确保您的列表不会被修改,而它所持有的引用可能指向的对象不是不变的

也就是说,即使是这样,并行化也不会自动到来。F#不是纯语言,因此它无法确定对象引入了什么样的副作用,也无法自行并行化任何东西(即使可以,也可能不是非常有效的解决方案,因为自动并行化并不那么容易)

下面的问题很好地描述了这一点:


当然,这些都是一般性的,因为我们不知道你问题的细节。

我认为,在这个问题的背景下,应该说明F#immutable structures对你没有很大帮助,因为如果你按照其他答案中的描述创建不可变F#list,你只能确保你的列表没有被修改,而它所持有的引用可能指向的对象不是不变的

也就是说,即使是这样,并行化也不会自动到来。F#不是纯语言,因此它无法确定对象引入了什么样的副作用,也无法自行并行化任何东西(即使可以,也可能不是非常有效的解决方案,因为自动并行化并不那么容易)

下面的问题很好地描述了这一点:


当然,这些都是一般性的,因为我们不知道你问题的细节。

我没有投反对票,但如果没有更多细节,很难回答你的问题

在F#中,不可变列表是最常用的数据结构。您通常使用cons构造函数
(::)
和空列表
[]
来构造列表。例如,
[1;2;3]
1::2::3::[]
的语法糖。您可以按照@Brian建议的链接阅读有关基本列表处理的更多信息

一旦你习惯了F#列表,你就可以使用和列表理解来创建新的列表。在您的情况下,可以按如下方式生成随机数列表:

let genRand =
    let rand = System.Random()
    fun () -> rand.NextDouble()

/// Creating a list using high-order functions
let genRandList n = List.init n (fun _ -> genRand())

/// Creating a list using list comprehension
let genRandList' n = [ for i in 1..n -> genRand() ]
我不熟悉蒙特卡罗模拟;但是通读一遍,一旦生成了随机数列表,您将在列表元素上应用几个
List.map
函数。出于并行性的目的,我建议您使用数组而不是列表,这样可以提供更好的加速。数组允许对元素进行随机访问,因此不同的线程可以轻松地并行访问数组中不相交的部分。虽然数组是可变的,但是由于数组的理解和使用,您可以以无副作用的方式使用它们

为了使每个元素上的任务具有重要意义,您应该将一系列
Array.map
合并为一个,并将
Array.map
更改为以实现并行性。您还可以并行化
mean
函数;然而,它不可能给你任何加速。请看一看,了解解决方案与阵列的关系

更新

创建记录列表:

type RandPair = { First: float; Second: float}
let genRandPairs n = [ for i in 1..n -> 
                          { First = genRand(); Second = genRand() } ]

你也可以这样做。

我没有投反对票,但如果没有更多细节,很难回答你的问题

在F#中,不可变列表是最常用的数据结构。您通常使用cons构造函数
(::)
和空列表
[]
来构造列表。例如,
[1;2;3]
1::2::3::[]
的语法糖。您可以按照@Brian建议的链接阅读有关基本列表处理的更多信息

一旦你习惯了F#列表,你就可以使用和列表理解来创建新的列表。在您的情况下,可以按如下方式生成随机数列表:

let genRand =
    let rand = System.Random()
    fun () -> rand.NextDouble()

/// Creating a list using high-order functions
let genRandList n = List.init n (fun _ -> genRand())

/// Creating a list using list comprehension
let genRandList' n = [ for i in 1..n -> genRand() ]
我不熟悉蒙特卡罗模拟;但是通读一遍,一旦生成了随机数列表,您将在列表元素上应用几个
List.map
函数。出于并行性的目的,我建议您使用数组而不是列表,这样可以提供更好的加速。数组允许对元素进行随机访问,因此不同的线程可以轻松地并行访问数组中不相交的部分。虽然数组是可变的,但是由于数组的理解和使用,您可以以无副作用的方式使用它们

为了使每个元素上的任务具有重要意义,您应该将一系列
Array.map
合并为一个,并将
Array.map
更改为以实现并行性。您还可以并行化
mean
函数;然而,它不可能给你任何加速。请看一看,了解解决方案与阵列的关系

更新

创建记录列表:

type RandPair = { First: float; Second: float}
let genRandPairs n = [ for i in 1..n -> 
                          { First = genRand(); Second = genRand() } ]

您也可以这样做。

在回答如何使用列表之前,您可能需要确定为什么要使用列表

这不是小事,因为我们在计算机科学中称之为列表的是一个虚拟企业