我从Java的背景学习Haskell。当我编写的Java,我觉得我有对象在内存布局有深刻的理解和可能带来的后果。例如,我确切地知道如何java.lang.Stringjava.util.LinkedList的工作,因此我知道我应该如何使用它们。哈斯克尔我有点失落。例如,如何做(:)工作?我要在乎?它是指定的地方?

有帮助吗?

解决方案

简短的答案是否定的。当在Haskell编程,你应该觉得你的数据结构为纯数学的对象,而不是担心他们是如何在内存中表示。这样做的原因是,在没有副作用的,没什么好说的的不同之处在于创造它,你可以用它来提取简单的部分职能和功能的数据外面有人构建

要查看有关数据构造等(:),或任何其他条款信息,使用:type(或简称只是:t)命令内GHCI:

:Prelude> :type (:)
(:) :: a -> [a] -> [a]

这告诉您(:)构造(发音为“缺点”),采用任何类型的值,并且相同类型的列表,并返回相同类型的列表。您还可以通过使用:info命令获得更多的信息。这将告诉你什么是数据定义如下:

Prelude> :info (:)
data [] a = ... | a : [a]   -- Defined in GHC.Types
infixr 5 :

这告诉你(:)是前添加的元素,以现有列表的构造。

我也强烈建议 Hoogle 不仅通过名称查找的东西,但做相反的那种搜索;在那里,你知道你正在寻找的函数的签名,并希望找到如果有人已经写好给你。 Hoogle是不错的,因为它给出了说明和示例用法。

形状的感应数据

我上面说的,这不是重要的是知道在内存中的数据表示...你应该,但是,理解的形状的数据您处理,以避免性能不佳决定。哈斯克尔所有数据都归纳定义,这意味着它有一个类似树的形状展开有史以来向外递归。您可以通过查看它的定义告诉数据的形状;没什么好说的,隐藏的有关其性能特点,一旦你知道如何阅读:

data MyList a = Nil | Cons a (MyList a)

你可以从定义看,你可以得到一个新的MyList的唯一途径是由Cons构造。如果您使用此构造函数多次,你会的东西大约这种形状的结束:

(Cons a5 (Cons a4 (Cons a3 (Cons a2 (Cons a1 Nil)))))

这只是一个没有树的分支,这是一个list的定义!并获得在a1的唯一途径是通过突然离开每个依次Conss的;因此获得的最后一个元素是<强> O(n)的下,而获得的头部是恒定的时间。一旦你可以做这样的基础上他们的定义关于数据结构的推理,就这么简单。

其他提示

简短的回答是“不”,你不需要知道数据的布局 - 复杂的知识将是有用的,

要写入高度优化Haskell程序,一个良好的工作的数据结构的堆中形状的知识是至关重要的,但是。甲帮助这个工具是“真空” ,该可以呈现的Haskell数据结构的图因为它们被布置。

一些示例:

$ view "hello"

“链表”

$ view (IntMap.fromList $ zip [1..10] [1..])

“Data.IntMap”

下面是一个如何使用该工具的简短视频: HTTP:// WWW。 youtube.com/watch?v=X4-212uMgy8

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top