Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.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
Haskell 解释“;结婚”;_Haskell_Functional Programming_Tying The Knot - Fatal编程技术网

Haskell 解释“;结婚”;

Haskell 解释“;结婚”;,haskell,functional-programming,tying-the-knot,Haskell,Functional Programming,Tying The Knot,在阅读Haskell的相关文章时,我有时会遇到“打结”这个词,我想我理解它的作用,但不理解它是如何做到的 那么,对这个概念有什么好的、基本的、简单易懂的解释吗?这不是你想要的,它与哈斯克尔没有直接关系,但布鲁斯·麦克阿丹的论文在很大程度上深入探讨了这个话题。Bruce的基本思想是使用名为WRAP的显式打结操作符,而不是在Haskell、OCaml和其他一些语言中自动完成的隐式打结。这篇论文有很多有趣的例子,如果你对打结感兴趣,我想你会对这个过程有更好的感觉。打结是解决循环数据结构问题的一种方法。

在阅读Haskell的相关文章时,我有时会遇到“打结”这个词,我想我理解它的作用,但不理解它是如何做到的


那么,对这个概念有什么好的、基本的、简单易懂的解释吗?

这不是你想要的,它与哈斯克尔没有直接关系,但布鲁斯·麦克阿丹的论文在很大程度上深入探讨了这个话题。Bruce的基本思想是使用名为WRAP的显式打结操作符,而不是在Haskell、OCaml和其他一些语言中自动完成的隐式打结。这篇论文有很多有趣的例子,如果你对打结感兴趣,我想你会对这个过程有更好的感觉。

打结是解决循环数据结构问题的一种方法。在命令式语言中,您首先创建一个非循环结构,然后返回并修复指针以添加循环,从而构建一个循环结构

假设您想要一个包含元素“0”和“1”的两元素循环列表。这似乎不可能构造,因为如果创建“1”节点,然后创建“0”节点指向它,则无法返回并修复“1”节点以指向“0”节点。因此,在一个鸡和蛋的情况下,两个节点都需要存在,然后才能创建任何一个节点

这是你在哈斯克尔的做法。考虑下面的值:

alternates = x where
   x = 0 : y
   y = 1 : x
在非惰性语言中,由于未终止的递归,这将是一个无限循环。但是在Haskell中,惰性求值做了正确的事情:它生成一个两元素的循环列表

要了解它在实践中是如何工作的,请考虑在运行时会发生什么。惰性求值的常用“thunk”实现将未求值表达式表示为包含函数指针和要传递给函数的参数的数据结构。计算该值时,thunk将被实际值替换,以便将来的引用不必再次调用该函数


当您获取列表的第一个元素时,“x”将向下求值为一个值(0,&y),其中“&y”位是指向“y”值的指针。由于尚未对“y”进行评估,因此当前为thunk。当您获取列表中的第二个元素时,计算机将按照从x到该thunk的链接进行计算。它的计算结果为(1,&x),或者换句话说,是指向原始“x”值的指针。现在你有一个循环列表在记忆中。程序员不需要修复反向指针,因为惰性计算机制可以为您完成此操作。

检查。或。:)这很容易!我想,下一个问题是:如何在Haskell中的双链接列表中插入内容?@Alexey-基本答案是:添加插入元素后,复制整个列表。Haskell的数据结构是不可变的,这就是为什么我们不经常使用双链表的原因。我在互联网上找到了一些关于这个主题的讨论、谈话和文章,我正试图从中学习,但你的基本答案看起来不太令人信服:如果你在实现中复制双链表的单个节点,你复制了整个列表,因此不能向其中添加任何内容。Alexey,我的意思是,你必须构建一个新列表,其中既包含旧元素,也包含新元素。@Alexey,你可能不能。(除非我没有考虑过一些非常奇怪的边缘情况)至少在纯代码中是这样,在ST或IO或类似代码中做这样的事情不会很困难。