方案let语句

2024-03-19

在函数式编程语言scheme中,没有赋值语句。 但在一个let陈述

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

您正在分配2 to x,那么为什么这不违反函数式编程中没有赋值语句的原则呢?


“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执行一次单一作业 https://en.wikipedia.org/wiki/Assignment_%28computer_science%29#Single_assignment其变量,因此它不违反任何纯函数式编程原则per se,可以肯定如下let表达:

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

另外,引用维基百科:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

方案let语句 的相关文章

  • 如何在惰性函数式编程语言中实现调试?

    我想知道如何用惰性函数语言实现调试 你能使用断点 打印语句和传统技术吗 这是个好主意吗 据我了解 纯函数式编程不允许有副作用 除了 monad 之外 执行顺序也无法保证 您是否必须为要测试的每个代码部分编写一个 monad 我想从这个领域更
  • 传递给过程的列表转换为过程内列表的列表

    我正在 DrRacket 上调试这段代码 lang racket define last element on list lambda l cond null l null cdr l car l else last element on
  • Play Framework Form“折叠”方法命名原理

    Play 框架 2 x 表格类 http www playframework com documentation 2 0 api scala index html play api data Form有一个方法叫做foldwho 的用法表示
  • 番石榴中供应商的逆

    我正在寻找的逆Supplier
  • 将列表传播到父代 sexp 中

    在任何 lisp 中是否有一种形式可以在父 sexp 中 传播 列表 喜欢 spread 1 2 3 gt 1 2 3 有两种方法可以做到这一点 哪个更好取决于您最终想要什么 一般来说 您可以使用 inside 反引号 表格如下 被评估以生
  • OCaml 中 let rec 的限制

    这几天我在学习OCaml 发现了这个 OCaml 对于可以放在 let 记录右侧的内容有限制 像这个 let memo rec f norec let rec f memoize fun x gt f norec f x in f Erro
  • 更新对象值 Ramda

    在上一个问题中 我尝试按父 ID 对数组进行分组 然后从每个对象中删除它们 按父 ID 对象 Ramda 对数组进行分组 https stackoverflow com q 58682137 9464680 但现在我有一个新问题 例如 我想
  • 用于提前退出循环的功能代码

    如何以函数式风格重构此代码 scala 惯用 def findFirst T objects List T T for obj lt objects if expensiveFunc obj null return obj null asI
  • Scala 中的自定义“let”表达式

    我很想拥有let构造类似于 Scala 中的 Haskell 中的构造 我尝试了几种方法 但似乎都不好 这是一些代码 object CustomLet extends App val data for i lt 1 to 1024 j lt
  • 在 Haskell 中的列表上编写递归函数

    我有以下问题 定义函数 and or Bool gt Bool 它给出了布尔值列表的合取和析取 例如 and False True False or False True True 在空列表上and gives True and or gi
  • 为什么不是 (20 >) 。长度 。取 10 === const True

    tl dr 事实难道不是这样吗20 lt length take 10 whatever需要whatever成功地对列表进行模式修补 至少 or 缺乏 懒惰 或者 换句话说 为什么不 20 gt length take 10 const T
  • 如何解释方案表达式 '(a 'b)

    a b 给出答案 a b 当 a 没有绑定 未加引号 时 这是如何工作的 这就是我们计算表达式时发生的情况 a b gt a b The quote 是简写quote http docs racket lang org guide quot
  • 如何使用非类型化语言中的 Reader Monad 在整个组合中隐式地线程化参数?

    我知道裸读者单子仅包含两个功能 const chain g gt f gt x gt f g x x const of x gt gt x 但我对它如何工作或如何应用没有任何直觉 知道 is 用于在整个组合中隐式地线程化参数并没有多大帮助
  • 未确定的泛型类型在 ghci 的运行时中如何表示

    我很清楚通用函数和通用数据类型 在泛型类型中 data SB forall x show x gt SB x instance Show SB where show SB x show x 所以对于任何给定类型x 如果它有一个签名Show
  • 是否可以有效地计算 lambda 演算项?

    我最近用 lambda 演算编写了很多程序 我希望能够实时运行其中一些程序 然而 尽管趋势函数范式基于 lambda 演算和 B 约简规则 但我找不到一个不是玩具 不以效率为目的的评估器 函数式语言应该很快 但我所知道的那些语言实际上并不提
  • Kotlin 的不同类型的 reduce() 函数

    我正在查看数组扩展函数并发现reduce one inline fun
  • 使用参与者模型进行基于时间的模拟

    我们有一个单线程应用程序 可以模拟数十万个对象随着时间的推移与共享内存模型的交互 显然 它无法在多 CPU 硬件上进行扩展 在阅读了一些有关基于代理的建模和函数式编程 参与者模型的内容后 我正在考虑使用消息传递范例进行重写 这个想法非常简单
  • Letrec 和可重入延续

    有人告诉我 以下表达式的计算结果为 0 但许多方案的实现将其计算为 1 let cont f letrec x call with current continuation lambda c set cont c 0 y call with
  • 在自己的定义中使用变量?

    无限流 val ones Stream Int Stream cons 1 ones 一个值怎么可能在它自己的声明中使用呢 看起来这应该会产生编译器错误 但它确实有效 它并不总是递归定义 这实际上有效并产生 1 val a Int a 1
  • Haskell:Where 与 Let

    我是 Haskell 的新手 我很困惑Where vs Let 它们似乎都提供了相似的目的 我读过一些比较Where vs Let但我很难辨别何时使用它们 有人可以提供一些背景信息或者一些示例来说明何时使用其中一种而不是另一种吗 哪里与让

随机推荐