在OO中,我有对象(类的实例)。我创建了对象,它们会在内存中留下来,我会随着时间的推移对它们进行修改。
我看待Haskell的方式:我没有物体。真的,在记忆中没有任何东西。事物只是暂时创造并传递功能以创造新的瞬间事物。等等。我的第一个问题:这是对Haskell的准确描述吗?
搬到Haskell,我有时候真的不知道从哪里开始。我如何解决我在OO中解决的同样问题?所以我转向看似显而易见的事情:我创建状态数据结构(通常使用记录语法)。这些都是类似物体,所以他们对我很熟悉(除了他们在我上面谈到的那些瞬间)。然后我只创建一组函数,它们接受一个状态数据结构(" object")加上一些其他数据并返回一个新的状态数据结构(" object")以及其他一些新的数据。这就是我发现自己所做的一切。我无法想象其他任何做事方式。 (好吧,除了我创建小的纯实用程序函数。这些类型对应于OO中的私有方法。特定任务的小实用程序函数。)第二个问题:我做的事情听起来是正确还是我在错误的道路?
答案 0 :(得分:2)
我宁愿反过来说:在Haskell中,没有什么是暂时的,或者根本不关心任何时间尺度。你一劳永逸地定义的东西,价值“一直都会一直存在”。
(当然不是真的;那将是非常低效的内存。你还没有评估的东西实际上不会存在于内存中,而只是以抽象的thunk形式存在,并且不再需要的东西将会像Java一样被垃圾收集。)
不要考虑物体如何及时变化,而是立即考虑最终结果,即“理想的最终状态”。
现在,显然,程序的整个目的通常是及时做事,而不仅仅是给出一些最终结果。好吧,在Haskell中,我们更喜欢将这些过程想象成一个大图:你试图将整个行为或“状态历史”视为一个单一的抽象超值。例如,功能反应式编程将状态历史描述为时间变量的函数。函数随着时间的推移有多个值,但函数本身只是一个值,您可以一次性定义。