【问题标题】:Scheme let statement计划让声明
【发布时间】:2013-02-03 07:39:41
【问题描述】:

在作为函数式编程语言的方案中,没有赋值语句。 但在let 声明中

(let ((x 2))
    (+ x 3))

你是把2赋值给x,那为什么不违反函数式编程中没有赋值语句的原则呢?

【问题讨论】:

    标签: functional-programming scheme let


    【解决方案1】:

    “Scheme 是一种函数式编程语言”的说法不正确。在 Scheme 中,鼓励但不强制采用函数式编程风格。事实上,你可以使用set!(一个赋值语句!)来修改任何变量的值:

    (define x 10)
    (set! x (+ x 3))
    x
    => 13
    

    关于问题的let 语句,请记住这样的表达式:

    (let ((x 10))
      (+ x 3))
    => 13
    

    ...它只是语法糖,在底层实现如下:

    ((lambda (x)
       (+ x 3))
     10)
    => 13
    

    注意let 对其变量执行一次single assignments,因此它不违反任何纯函数式编程原则本身,以下可以肯定@987654328 @表达式:

    如果表达式的计算不改变机器的可观察状态,并且对相同的输入产生相同的值,则表达式的评估不会产生副作用

    另外,引用维基百科:

    不纯函数式语言既提供单一赋值也提供真赋值(尽管真赋值的使用频率通常低于命令式编程语言)。例如,在 Scheme 中,单一赋值(let)和真赋值(set!)都可以用于所有变量,并且提供了专门的原语用于列表、向量、字符串等内部的破坏性更新。

    【讨论】:

    • 一种函数式编程语言鼓励并提供功能,但不一定强制执行函数式编程。
    • span 不强制执行函数式编程风格并不意味着这样称呼它是不正确的。它确实提供了使用命令式操作的能力,如 set(改变环境以影响状态),但它不提供完整的功能集,如循环等,因此 Scheme 是一种函数式编程语言,它提供了一些命令式特性。
    • @NeoH4x0r 实际上,Scheme 确实 提供了传统的循环(参见do 循环),并且根据方言的不同,for 循环结构的种类繁多。我会说这是一组非常完整的命令式功能:)。告诉我您认为缺少的一项功能,我敢打赌我可以为您找到它!
    • @Óscar López 调用函数语言仍然不会导致错误(即使它提供了一些命令式特性)。
    【解决方案2】:

    http://en.wikipedia.org/wiki/Assignment_(computer_science)#Single_assignment

    基本上,这是一个允许的单一分配。由于副作用,其他分配不是“允许的”。

    编辑:允许引用,因为正如 Oscar 所说,这不是强制性的,而是建议的。

    【讨论】:

      猜你喜欢
      • 2023-02-02
      • 2021-09-22
      • 2015-05-19
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      • 2020-02-23
      • 1970-01-01
      • 2013-07-13
      相关资源
      最近更新 更多