如何在函数式编程中递增变量? [英] How to increment a variable in functional programming?

查看:28
本文介绍了如何在函数式编程中递增变量?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何在函数式编程语言中递增变量?

例如,我希望这样做:

main :: IO ()
main = do
    let i = 0
    i = i + 1
    print i

预期输出:

1

推荐答案

简单的方法是引入变量名的隐藏

main :: IO ()                  -- another way, simpler, specific to monads:
main = do                         main = do
    let i = 0                         let i = 0
    let j = i                         i <- return (i+1)
    let i = j+1                       print i
    print i                    -- because monadic bind is non-recursive

打印1

仅编写let i = i+1不起作用,因为let在Haskell中生成了递归定义-它实际上是方案的letreclet i = i+1右侧的i指的是左侧的i,而不是的上级i。因此,我们通过引入另一个变量j来分解该方程。

另一种更简单的方法是在do表示法中使用一元绑定,<-。这是可能的,因为一元绑定是而不是递归的。

在这两种情况下,我们都以相同的名称引入new变量,因此";隐藏";旧实体,即使其不再可访问。

如何思考函数性(&Q;)

这里要理解的一件事是,使用纯不可变值的函数式编程(就像我们在Haskell中所做的那样)迫使我们在代码中使时间显式

在命令性设置中,时间是隐式的。我们更改我们的变量(&Q;)-但任何更改都是顺序的。我们永远不能更改刚才变量,只能更改从现在开始的

在纯函数式编程中,这只是显式的。最简单的形式之一就是在命令式编程中使用值列表作为顺序更改的记录。更简单的是完全使用不同的变量来表示一个实体在不同时间点的不同值(参见:single assignmentstatic single assignment form或SSA)。

因此,我们不会更改不能真正更改的内容,而是制作它的增强副本,并将内容传递出去,用它来代替旧的内容。

这篇关于如何在函数式编程中递增变量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆