http://www.haskell.org/haskellwiki/State_Monad上的具体示例对于理解如何使用 monad 编写真实代码非常有帮助(另请参见 stackoverflow/9014218)。但是我们大多数新学生都来自 OO 背景,因此将 OO 程序映射到 haskell 将有助于演示如何编写等效的 haskell 代码。(是的,这两种范式是完全不同的,直接将 OO 风格的代码翻译成 haskell 是不明智的,但仅此一次作为教程。)
这是一个OO风格的代码,它创建一个对象的2个实例,然后调用修改各自成员变量的成员函数,最后打印它们。我们如何使用 haskell state monads 编写这个?
class A:
int p;
bool q;
A() { p=0; q=False;} // constructor
int y() { // member function
if(q) p++; else p--;
return p;
}
bool z() { // member function
q = not q;
return q;
}
main:
// main body - creates instances and calls member funcs
a1 = A; a2 = A; // 2 separate instances of A
int m = a1.y();
m = m + a1.y();
bool n = a2.z();
print m, n, a1.p, a1.q, a2.p, a2.q;