问题标签 [haskell-vector]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - 有没有办法在这个例子中避免 UndecidableInstances ?
当我尝试这个时:
...我收到此错误:
使用UndecidableInstances
确实可以让它消失,但我对使用该扩展程序持谨慎态度。在这种情况下,还有其他方法可以使事情正常进行吗?(最好不要过多地改变类型。)
haskell - 使用 generate 将值散布到单独的向量中
我试图Vector
通过使用从索引创建自定义数据类型(或元组)值的函数来生成 s 的元组。这是一种达到预期结果的方法:
除了我想在每个向量中进行一次迭代之外,几乎就像下面显示的那样,但要避免对函数进行多次评估f
:
就像一个注释,我知道Vector
库支持融合,第一个例子已经很有效了。我需要一个generate
概念的解决方案,其他库有非常相似的构造函数(fromFunction
例如 Repa),我在Vector
这里使用 s 只是为了演示一个问题。
也许某种f
函数调用的记忆会起作用,但我想不出任何东西。
编辑:
使用 Repa 的问题的另一个演示:
与向量相同,融合节省了性能,但仍然需要一个中间arr
元组数组,我试图避免这种情况。
编辑2:(3年后)
在上面的 Repa 示例中,它不会创建中间数组,因为fromFunction
会创建延迟数组。相反,它会更糟,它会f
为每个索引计算两次,一个用于第一个数组,第二次用于第二个数组。必须计算延迟数组以避免这种重复工作。
haskell - Haskell 使用索引创建带有子向量的向量
我正在尝试创建一个包含子向量的向量,该子向量由使用子向量索引的向量从另一个向量中取出的元素组成。中的每个元素都对应于其中的元素在放入时应具有b
的子向量索引。a
c
我有点卡住了,收到错误
“无法将预期类型 [Int] 与 stmt 列表理解 k <- b 中的实际类型 Vector Integer 匹配”
haskell - Haskell 向量类型声明
我正在编写一个要传递给的比较器,sortBy
但我无法正确声明类型。输入是两个Data.Vector
,每个包含两个数字。
GHCI 抱怨:
预期有约束,但“向量 a”有种类“*”
haskell - 向量类型之间的 Haskell 转换
我开始学习 Haskell,但我发现很难弄清楚教程跳过的小事。现在我正在使用 Vector.Fixed 形式的元组:
a
和 有什么区别b
?如何使 VF 向量
f
等效于[a, a] = [(7,7), (7,7)]
?如何使 VU 向量
g
等效于[[a], [a,a]] = [[(7,7)], [(7,7), (7,7)]]
?
convert
对于问题 2 和 3,我在尝试使用该功能时无法克服类型错误。
我知道我的元组总是长度为 2,但我需要一个
f
可以固定大小的元组列表(或其他),另一个g
是二维的(例如[[(1,2),(3,4)],[(1,2)]]
,顶部列表和子列表都不是固定大小。我应该坚持使用相同的类型f
吗g
?Data.Vector.Fixed 和 Data.Vector.Unboxed 似乎都来自同一个包,但它们的维护者不同。可以这么说,它们都是官方的,还是除了它们都是矢量实现之外,它们没有任何相似之处吗?
haskell - 可存储向量和未装箱向量之间的差异
所以......我vector
现在最好使用未装箱的向量(来自包装),而没有给予太多考虑。vector-th-unbox
为它们创建实例变得轻而易举,为什么不呢。
现在我遇到了一个实例,我无法自动派生这些实例,这是一种带有幻像类型参数的数据类型(如Vector (s :: Nat) a
,其中s
编码长度)。
这让我想到了Storable
和Unboxed
向量之间的区别。我自己想出来的事情:
Unboxed
将例如元组存储为单独的向量,从而在只需要其中一个值时不浪费带宽,从而导致更好的缓存局部性。Storable
仍将被编译为readArray#
返回未装箱值的简单(并且可能是有效的)s(如阅读核心所示)。Storable
允许直接指针访问,这允许与外部代码的互操作性。Unboxed
没有。- [编辑]实例实际上比(即和)
Storable
更容易手写。Unbox
Vector
MVector
仅这一点并不能让我明白为什么Unboxed
甚至存在,它似乎没有什么好处。可能我在那里遗漏了什么?
haskell - 我应该期望 Data.Vector 融合以下功能吗?
我最近开始使用 Data.Vector。我的理解是它应该能够采用向量操作链并通过融合有效地组合它们。
特别是,我希望这两个函数具有相似的性能特征(即 searchTopDown 融合成类似 searchTd 的东西)。
但是,对此代码进行基准测试显示了数量级的性能差异。
问题:是什么阻止了 searchTopDown 被融合?我能做些什么来帮助它融合?我应该什么时候期待融合?
用于基准测试的代码:
编辑
遵循@Zeta 的建议(添加-O2
),我从这两个功能中都获得了出色的性能。但是,我在一个较大的项目中遇到了这个问题,所以我更改了基准测试代码以使其类似。searchTopDown
在这种情况下似乎是线性的i
。新的基准测试代码和结果(以微秒为单位):
haskell - 共享可变向量是否与 GHC Haskell 中的原子操作同步?
我正在 Haskell 中寻找共享并发向量,所以我会接受一个指向性能解决方案的答案,而不是我在这里讨论的解决方案,即将向量库与 stm 或 atomic-primops 相结合。
我有两个线程共享一个可变向量 ( Data.Vector.Mutable.IOVector
) 和一些可以原子地切换一次的标志(例如,TVar
使用 stm 或IORef
atomic-primops)。线程 1 可以在原子地切换标志之前或之后写入向量(非原子地),线程 2 可以在检查标志是否已切换之前或之后从向量中读取。
具体来说,这里有一些最小的例子。是否存在导致他们评估的数据竞赛undefined
?
- 使用 STM 的示例:http: //lpaste.net/362596
- 使用 atomic-primops 的示例:http: //lpaste.net/362595
更一般地说,标志上原子操作的相对顺序是否意味着向量上的操作之间存在某种顺序?特别是,我想知道以下是否属实:
- 如果检查发生在切换之前,则检查之前的读取无法看到切换之后的写入。
- 如果检查发生在切换之后,那么检查之后的读取必须看到切换之前的写入。
在 atomic-primops 的情况下,我特别怀疑使用readIORef
/ readForCAS
,因为文档说它并不意味着任何障碍。
haskell - Data.Vector 的修改真的可以就地完成吗?
在源代码中modify
指出,如果这样做是安全的,则操作将在适当的位置执行,否则将修改向量的副本。
但是查看以下代码modify
:
在我看来,clone
它总是被调用(这对我来说很有意义,因为我认为它必须是对不可变向量的破坏性操作)。
我误解了这个吗?如果不是,什么地方clone
没有调用的例子,如何Data.Vector
实现绕过?
haskell - 带有嵌套向量的 Data.Vector.modify
我有一个嵌套在另一个向量中的向量。我想用来modify
更新这个矩阵。所以我将它用于内部向量,但我还需要将它用于外部吗?