我试图理解很多基本的计算机科学概念是如何在函数式语言中实现的。我目前不能理解的一点是函数式语言和哲学是如何处理内存中的地址的。
在像排序这样非常基础的计算机科学概念的背景下,如何有效地处理不变性问题?我知道结构化共享对于防止内存爆炸是非常必要的。但在我看来,这意味着像选择排序这样相对简单的概念可能会变得相当复杂。
有人能解释一下函数式语言是如何就地处理排序的吗?“就地”的想法被抛弃了,取而代之的是支持结构化共享的数据结构吗?
我真的在试着理解不变性是如何与内存中的地址相适应的(想想指针)。例如,在就地排序中,数据不会被销毁,但会被移动到新地址。这算不算突变?我认为答案是肯定的。但是你如何做像旋转这样的事情来平衡二叉树呢?函数式程序员是如何看待指针的?
我知道这是一个相对很难回答的问题,但我觉得这是一个真正理解函数范式的大问题。我们将非常感谢您的任何见解或资源。
发布于 2018-09-07 19:58:08
例如,在就地排序中,数据不会被销毁,但会移动到新地址。
这没有任何意义。如果数据被“移动到新地址”,根据定义,算法将不再“就地”工作。
发布于 2018-09-07 23:22:46
你的困惑来自混杂的抽象层次。
在您最喜欢的OO垃圾收集语言(Python、Java、Ruby等)中,内存分配是如何处理的?你不知道。该细节留给编译器和/或运行时。您混淆了编程语言的语义和该语言的编译器的实现细节。我承认C/C++模糊了很大的区别,但这种模糊可能是这些语言在这一点上最突出的特征。
考虑一种常见的关联数据结构,即C结构:
struct address
{
char number[10];
char street[100];
char city[50];
char state[15];
};我们预先知道,这在内存中会是什么样子。但是考虑一下类似的数据结构,比如Java:
public class Record {
public int number;
public String street;
public String city;
public String state;
}这将如何在内存中进行布局?你不知道。即使你用字符缓冲区替换字符串,你也不会真正知道。显然,javac让这一切发生了。这与函数式语言中的持久化数据结构没有什么不同:将内容放到内存中的位置取决于编译器,而编译器并不受它正在编译的语言的语义的约束。
https://stackoverflow.com/questions/52213789
复制相似问题