相关疑难解决方法(0)

Haskell数组与列表

我正在玩Haskell和Project Euler的第23个问题.用列表解决后,我去了这里看了一些数组工作.这个解决方案比我的快得多.所以这就是问题所在.我什么时候应该在Haskell中使用数组?他们的表现比名单更好吗?在哪些情况下?

haskell

18
推荐指数
3
解决办法
3584
查看次数

Haskell:使用O(1)追加和O(1)索引的Datastruture?

我在Haskell中寻找一种支持快速索引和快速追加的数据结构.这是针对由递归引起的memoization问题.

从矢量在c ++中工作的方式(这是可变的,但在这种情况下应该无关紧要)它似乎是不可变的向量与(摊销)O(1)追加和O(1)索引应该是可能的(好吧,它不是,看到这个问题的评论).这在Haskell中是不可能的,还是应该使用Data.Sequence,它有(AFAICT无论如何)O(1)追加和O(log(min(i,ni)))索引?

在一个相关的说明中,作为一个Haskell新手,我发现自己渴望一个实用,简洁的Haskell数据结构指南.理想情况下,这将对最实用的数据结构以及性能特征和指向Haskell库的指针进行相当全面的概述.似乎有很多信息,但我发现它有点分散.我问得太多了吗?

haskell vector data-structures

8
推荐指数
3
解决办法
2189
查看次数

使用镜头插入特定位置的列表

我正在尝试对包含元素列表的嵌套数据结构进行操作.在用各种方法解决之后,我终于决定使用镜头作为最好的方法.它们完美地用于查找和修改结构的特定元素,但到目前为止,我对如何添加新元素感到困惑.

从我读过的内容来看,我无法在技术上使用Traversal,因为它违反了Traversal定律,将新元素插入到列表中,并且假设我甚至可以首先使用Traversal找出如何做到这一点(我对Haskell仍然相当弱,并且镜头包装中大多数东西的类型签名让我头晕目眩.

具体来说,我想要完成的是,在匹配特定选择器的元素列表中找到一些元素,然后在匹配元素之前或之后插入一个新元素(函数的不同参数在之前或之后)比赛).Control.Lens是否已经拥有可以完成我正在尝试做的事情,而且我对类型签名的理解太弱而无法看到它?有没有更好的方法来完成我想要做的事情?

如果我只是想在列表的开头或结尾添加一个新元素,那么这将是相当微不足道的,但是将它插入特定于中间的某个地方是困难的部分.在我编写的一些前镜头代码中,我使用折叠来完成我想要的东西,但它开始变得粗糙在结构的更深嵌套部分(EG折叠内部的折叠内部)所以我转向Control.Lens试图解开一些混乱.

haskell list lenses

6
推荐指数
2
解决办法
879
查看次数

创建UArray的自定义实例

假设我有一个简单的数据类型,如:

data Cell = Open | Blocked
Run Code Online (Sandbox Code Playgroud)

我想用一个UArray Int Cell.是否有捷径可寻?我可以以某种方式重用该定义UArray Int Bool吗?

arrays unboxing haskell

6
推荐指数
1
解决办法
500
查看次数

1D Haskell列表上的随机访问性能

我有一个Haskell程序,它使用Metropolis算法模拟Ising模型.主要操作是模板操作,它在2D中获取下一个邻居的总和,然后将其与中心元素相乘.然后元素可能会更新.

在C++中,我获得了不错的性能,我使用一维数组,然后使用简单的索引算术线性化对它的访问.在过去的几个月里,我已经拿起Haskell来拓宽视野,并尝试在那里实施Ising模型.数据结构只是一个列表Bool:

type Spin = Bool
type Lattice = [Spin]
Run Code Online (Sandbox Code Playgroud)

然后我有一些固定的程度:

extent = 30
Run Code Online (Sandbox Code Playgroud)

以及get检索特定晶格点的函数,包括周期性边界条件:

-- Wrap a coordinate for periodic boundary conditions.
wrap :: Int -> Int
wrap = flip mod $ extent

-- Converts an unbounded (x,y) index into a linearized index with periodic
-- boundary conditions.
index :: Int -> Int -> Int
index x y = wrap x + wrap y * extent

-- Retrieve a single element from the lattice, automatically …
Run Code Online (Sandbox Code Playgroud)

performance haskell

4
推荐指数
1
解决办法
395
查看次数

Python 列表是否与我的数据结构和算法教科书中定义的列表相同?

我正在阅读一本关于数据结构和基本算法的书,以更好地掌握编程。我正在阅读的这本书定义了一些数据结构,例如列表、数组等,并指定了这些数据结构的接口,以及如何使用不同语言的现有数据结构来实现(或构造)它们。例如,它讨论了如何将列表构造为数组或链接单元格。

然而,当我开始查看不同语言中的这些数据类型时,我发现它们并不总是遵循书中定义的接口。

例如,这本书说,在一个列表中,你应该能够一次遍历不同的元素,只从两端开始。例如,如果我想要第三个元素,我必须从第一个元素开始并使用“下一个”操作,直到找到我想要的元素。但是 Python 中的列表具有整数索引,我可以通过使用相应的索引直接访问任何元素。在本书中,索引类型只需是带有比较操作的有序类型即可。(我认为这本书试图通过抽象事物来保持一般性)。

这是否意味着 Python 的列表不是“真正意义上的”列表?还是书中定义的数据结构只是对这些接口的外观的建议,在实践中可能会有很多变化?

我理解这本书的想法是为了更好地理解如何思考数据结构,并介绍一些典型的,所以我倾向于认为后一个答案是正确的。

python data-structures

4
推荐指数
1
解决办法
200
查看次数

Haskell风格:模式匹配与更直观的解决方案

我刚刚开始使用Haskell,所以我试图围绕"Haskell的思维方式".有没有理由使用模式匹配来解决问题1 这里基本上是通过展开整个列表并递归调用函数,而不是直接检索最后一个元素myLast lst = lst !! ((length lst) - 1)?它似乎几乎是暴力,但我认为这只是我对这里缺乏熟悉感.

haskell

3
推荐指数
1
解决办法
108
查看次数