rwa*_*ace 5 haskell functional-programming
Haskell 是一种纯函数式语言,它为命令式表达式的等价物提供语法糖。例如,这个 Python 代码:
def f():
n = 0
for i in range(10):
n += 1
return n
Run Code Online (Sandbox Code Playgroud)
可以使用 monad 逐行翻译成同构的 Haskell 代码。
函数改变其周围环境的代码也是如此吗?例如:
def f():
n = 0
def g():
nonlocal n
n += 1
for i in range(10):
g()
return n
Run Code Online (Sandbox Code Playgroud)
有没有办法将上面的一行一行翻译成同构的 Haskell?
我已经完全准备好接受答案是否定的,需要重新设计代码才能以不同的方式做同样的事情。但我认为值得询问是否有同构翻译。
您可以使用 aState来封装State.
在这种情况下,您g可以看起来像:
import Control.Monad.State.Lazy(State, modify)
g :: State Int ()
g = modify (1+)Run Code Online (Sandbox Code Playgroud)
thenf也是一个State首先将状态设置为0然后运行g十次的:
import Control.Monad(replicateM_)
import Control.Monad.State.Lazy(State, get, put)
f :: State Int Int
f = do
put 0
replicateM_ 10 g
getRun Code Online (Sandbox Code Playgroud)
然后你可以在我们提供初始状态的地方运行f,evalState :: State s a -> s -> a它将返回项目的结果State s a,所以这里get返回的是什么:
Prelude Control.Monad.State.Lazy> evalState f 0
10
Run Code Online (Sandbox Code Playgroud)