我经常被告知,使用OCaml中的Lazy模块,可以在诸如Haskell这样的惰性语言中做任何你能做的事情。为了测试这个声明,我正在尝试编写一个函数,将常规列表转换为ocaml中的静态双向链表。
type 'a dlist = Dnil | Dnode of 'a dlist * 'a * 'a dlist
对于这种类型,我可以手动创建几个静态双向链表:
let rec l1 = Dnode (Dnil,1,l2)
and l2 = Dnode (l1,2,l3)
and l3 = Dnode (l2,3,Dnil)
但是我想写一个'
我正在用OCaml实现一个Prolog解释器。我遇到的问题是在main函数中。本质上,我试图将我的解释器堆栈存储在一个函数调用中,并修改该堆栈的副本,然后将该副本从这个特定的函数调用传递给递归调用。当递归调用报告失败时,这个原始函数调用应该使用我保持不变的原始堆栈,并进行不同的递归调用(以实现回溯)。
现在,问题来了。当我只打算修改tempstack时,栈和临时栈(tempstack)都会被修改。我花了几个小时试图弄清楚这个问题,我很确定就是这个问题。下面是main函数的代码片段..
let rec main stack clauselist counter substitutions var
问题
我想要创建一个数据类型,这将允许快速访问和修改其元素。是否有可能在Haskell中创建一个结构和函数,其执行速度与简单的C++实现一样快?
问题详细信息
我在用Haskell写一个编译器。我有一个数据类型表示的,让我们考虑下面的一个:
import Prelude hiding (id)
-- this is a sample data type, the real one has got a lot of constructors
data AST = A { id :: Int, x :: AST, y :: AST, z :: AST }
| B { id ::
我已经接受了以下问题的答案,但我似乎误解了haskell中数组是如何工作的。我以为他们只是把名单加起来了。阅读下面的问题时要记住这一点。
我发现haskell中的单块数组在用于更大的数组时效率很低。
我还没有在haskell中找到一个非单块的数组实现。我需要的是在多维数组上查找O(1)时间。
是否有支持此功能的数组的实现?
编辑:我似乎误解了“铁板一块”这个词。问题是,haskell中的数组似乎将数组视为一个列表。不过,我可能错了。
EDIT2:低效代码的简短示例:
fibArray n = a where
bnds = (0,n)
a = array bnds [ (i, f i)
数据结构有变异操作和非变异操作。例如,字典插入可以更改其基础数据结构的状态,但查找通常不会。
一些数据结构会变异它们的内部结构--即使是在逻辑上不发生变异的操作--但是以一种不会改变可观察状态的方式。例如,在查找时将元素移动到根,而则将元素移动到查找时的头部。从逻辑上讲,这组键不受此操作的影响。
在C++中,这可以通过定义一个具有const方法但具有数据成员的数据结构来实现。在Haskell有办法这样做吗?我唯一能想到的就是
setContains :: Set k -> k -> (Set k, Bool)
但这是丑陋的,因为底层的数据结构改变了接口。
我正在编写一个游戏-playing ai (aichallenge.org - and ),它需要大量更新,并参考数据结构。我尝试过数组和地图,但是基本的问题似乎是每次更新都会创建一个新的值,这会使它变慢。如果你花了超过一秒的时间移动,游戏就会启动你,所以这个应用程序被算作“硬实时”。在Haskell中有可能实现可变数据结构的性能,还是应该学习Python,或者用OCaml重写我的代码?
我已经彻底改写了蚂蚁的“初学者包”。从数组到地图,因为我的测试显示Maps更新得更快。
我运行了地图版本,分析显示大约20%的时间是由地图更新完成的。
这里简单演示了Array更新的速度有多慢。
slow_a