Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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
我是否以正确的方式从OO移动到Haskell?_Haskell - Fatal编程技术网

我是否以正确的方式从OO移动到Haskell?

我是否以正确的方式从OO移动到Haskell?,haskell,Haskell,在OO中,我有对象(类的实例)。我创建对象,它们会留在内存中,我对它们进行操作,随着时间的推移对它们进行修改 我看哈斯克尔的方式:我没有物体。没有什么东西能真正留在记忆中。事物只是瞬间创建并传递给函数,以创建新的瞬间事物。等等我的第一个问题:这是对哈斯克尔的准确描述吗 搬到哈斯克尔,我有时真的不知道从哪里开始。如何解决我在OO中解决的相同问题?因此,我只想看一看似乎显而易见的事情:我创建状态数据结构(通常使用记录语法)。这些东西有点像物体,所以我对它们很熟悉(除了我上面提到的短暂的东西)。然后我

在OO中,我有对象(类的实例)。我创建对象,它们会留在内存中,我对它们进行操作,随着时间的推移对它们进行修改

我看哈斯克尔的方式:我没有物体。没有什么东西能真正留在记忆中。事物只是瞬间创建并传递给函数,以创建新的瞬间事物。等等我的第一个问题:这是对哈斯克尔的准确描述吗


搬到哈斯克尔,我有时真的不知道从哪里开始。如何解决我在OO中解决的相同问题?因此,我只想看一看似乎显而易见的事情:我创建状态数据结构(通常使用记录语法)。这些东西有点像物体,所以我对它们很熟悉(除了我上面提到的短暂的东西)。然后我创建了一组函数,它们接受一个状态数据结构(“object”)和一些其他数据,并返回一个新的状态数据结构(“object”)和一些其他新数据。这就是我发现自己在做的一切。我想不出还有什么别的办法。(好吧,除了我创建的小型纯实用程序函数。这些函数与OO中的私有方法相对应。用于特定任务的小型实用程序函数。)第二个问题:我所做的听起来正确吗?还是我走错了路?我宁愿换一种说法:在Haskell中,没有什么是瞬间的,或者与任何时间尺度有关。你一劳永逸地定义了东西,价值观“一直存在,也将永远存在”

(当然不是真的;那将是非常低效的内存。您尚未计算的内容实际上不会存在于内存中,而是以抽象的thunk形式存在,不再需要的内容将像Java一样被垃圾收集。)

与其考虑对象如何随时间变化,不如考虑最终结果,即“期望的最终状态”


现在,很明显,一个程序的全部目的是及时完成任务,而不仅仅是给出一些最终结果。在Haskell,我们喜欢把这些过程想象成一幅大图:你试图把整个行为或“国家的历史”视为一个抽象的超价值。例如,函数式反应式编程将状态历史描述为时间变量的函数。随着时间的推移,函数有许多值,但函数本身只是一个值,您可以一次性定义它。

Haskell中的值与OO语言中的值相同。对象通常在程序执行时一直被创建和销毁,就像Haskell中的值在不再需要它们之后被收集一样。把讨论范围缩小到具体的东西怎么样。给我们一个算法/计算,我们可以比较OO和Haskell实现。请注意,您可以在Haskell中使用可变数据结构,但也可以选择不使用。“创建一组函数,这些函数接收状态数据结构(“对象”)和一些其他数据,并返回一个新的状态数据结构”-是的,这是FP的本质。但是我们可以使用高阶函数来定义好的抽象,以适应我们在代码中发现的许多不同模式(包括那些最好被认为是“有状态的”),类型系统使这些抽象变得合理和可组合。