Functional programming 方案出租声明

Functional programming 方案出租声明,functional-programming,scheme,let,Functional Programming,Scheme,Let,scheme是一种函数式编程语言,它没有赋值语句。 但是在一个语句中 (let ((x 2)) (+ x 3)) 您正在将2赋值给x,那么这为什么不违反函数式编程中没有赋值语句的原则呢? 基本上,这是一个允许的单一任务。由于副作用,“不允许”进行其他作业 编辑:允许在引用中使用,因为正如Oscar所说,它不是强制性的,而是建议的。语句“Scheme是一种函数式编程语言”是不正确的。在Scheme中,函数式编程风格是鼓励的,但不是强制的。事实上,您可以使用set(赋值语句!): (def

scheme是一种函数式编程语言,它没有赋值语句。 但是在一个
语句中

(let ((x 2))
    (+ x 3))
您正在将
2
赋值给
x
,那么这为什么不违反函数式编程中没有赋值语句的原则呢?

基本上,这是一个允许的单一任务。由于副作用,“不允许”进行其他作业

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

语句“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
对其变量执行一次性操作,因此它本身不违反任何纯函数式编程原则,可以肯定
let
表达式的以下内容:

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

另外,引用维基百科:

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


函数式编程语言鼓励并提供函数式编程的特性,但不一定强制函数式编程。仅仅因为scheme不强制函数式编程风格并不意味着这样称呼它是不正确的。它确实提供了使用命令式操作(如set)的能力(更改环境以影响状态),但它不提供完整的功能集(如循环等),因此Scheme是一种函数式编程语言,提供了一些命令式功能。@NeoH4x0r实际上Scheme提供了传统的循环(参见
do
循环)根据方言的不同,的循环结构有很多不同的
。我想说这是一套相当完整的命令式功能:)。告诉我一个你认为缺少的功能,我打赌我能帮你找到@Óscar López如果调用函数语言(即使它提供了一些命令性功能),它仍然不会使它变得不正确。