有一种感觉是Haskell是一种纯函数语言,当然,惯用的代码尽可能地函数化。同时,Haskell确实提供了对其他语言中熟悉的命令式模式进行相当直接的转换的支持,例如http://learnyouahaskell.com/a-fistful-of-monads#do-notation
(我知道在某种意义上do-notation仍然是函数式的;这里的重点是它允许对某些命令式设计模式进行相当直接的转换。)
我感兴趣的一个模式是一个函数需要更新外部变量,即存在于与其他代码共享的外部作用域中的变量。这可以在Python中简单地演示:
可能使用do-notation的某种变体或其他方式,在Haskell中实现上述设计模式吗?如果可以,如何实现?
明确这个问题的范围:
我不是在问在Haskell中解决上述问题的最佳方法。显然,答案是
我不是在问上述设计模式是好还是坏。显然,那将是一个观点问题。
我不是在问在编写Haskell时,应该尽力避免使用命令式设计模式。显然,这也将是一个观点问题。
我只是在问是否可以在Haskell中实现上述设计模式,如果可以,如何实现。
我感兴趣的一个模式是一个函数需要更新外部变量,即存在于与其他代码共享的外部作用域中的变量。这可以在Python中简单地演示:
def three():
n = 0
def inc():
nonlocal n
n += 1
inc()
inc()
inc()
return n
可能使用do-notation的某种变体或其他方式,在Haskell中实现上述设计模式吗?如果可以,如何实现?
明确这个问题的范围:
我不是在问在Haskell中解决上述问题的最佳方法。显然,答案是
three = 3
。这只是一个例子。我不是在问上述设计模式是好还是坏。显然,那将是一个观点问题。
我不是在问在编写Haskell时,应该尽力避免使用命令式设计模式。显然,这也将是一个观点问题。
我只是在问是否可以在Haskell中实现上述设计模式,如果可以,如何实现。
IORef
、STRef
以及(名字容易令人混淆的)MVar
和TVar
。即使是被命名为TVar
和MVar
的这些对象,在 Haskell 中也并不称作变量。 - Chris Smith