用于改变其周围环境的函数的 Haskell 表达式?

标签 haskell functional-programming

Haskell 是一种纯函数式语言,它为命令式表达式的等价物提供语法糖。例如,这个 Python 代码:

def f():
    n = 0
    for i in range(10):
        n += 1
    return n
可以使用 monad 逐行翻译成同构的 Haskell 代码。
函数改变其周围环境的代码也是如此吗?例如:
def f():
    n = 0
    def g():
        nonlocal n
        n += 1
    for i in range(10):
        g()
    return n
有没有办法将上面的一行一行翻译成同构的 Haskell?
我完全准备好接受答案是否定的,需要重新设计代码才能以不同的方式做同样的事情。但我认为值得询问是否有同构翻译。

最佳答案

您可以使用 State 封装 State 的更改.
在这种情况下,您的 g因此可以看起来像:

import Control.Monad.State.Lazy(State, modify)

g :: State Int ()
g = modify (1+)
然后 f也是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
    get
然后你可以运行 f evalState :: State s a -> s -> a 我们提供了一个初始状态,它将返回 State s a 的结果。项目,所以这里是什么 get返回:
Prelude Control.Monad.State.Lazy> evalState f 0
10

关于用于改变其周围环境的函数的 Haskell 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67010279/

相关文章:

haskell - IO monad 处理,简化绑定(bind)语法

haskell - 如何在 Haskell 中编写游戏循环?

dictionary - Haskell map : Transform key and catch errors

haskell - stack new 命令无法下载 lts-14.1 的构建计划

返回带有参数的函数的 JavaScript 函数

functional-programming - 方案/ Racket : most idiomatic way to append single element to end of list

haskell - 仿函数父类(super class)型有冲突的实例

haskell - 我如何将 runhaskell 与 cabal-dev 一起使用?

haskell - 使用 libcairo 和 Haskell 的多页 SVG

javascript - 编写可重用的 javascript 模块和库。