一般来说,我们都听说过这些功能编程语言中或过程。但是,我发现我几乎可以互换使用这些术语(这可能是非常错误的)。
所以,我的问题是:
在功能,目的和用途上有什么区别?
一个例子将不胜感激。
(define (sqrt x) (newtons-method (lambda (y) (- (square y) x)) 1.0))
。
一般来说,我们都听说过这些功能编程语言中或过程。但是,我发现我几乎可以互换使用这些术语(这可能是非常错误的)。
所以,我的问题是:
在功能,目的和用途上有什么区别?
一个例子将不胜感激。
(define (sqrt x) (newtons-method (lambda (y) (- (square y) x)) 1.0))
。
Answers:
一个函数返回一个值,而一个过程仅执行命令。
名称函数来自数学。用于基于输入来计算值。
过程是可以按顺序执行的一组命令。
在大多数编程语言中,甚至函数也可以具有一组命令。因此,区别仅在于返回值部分。
但是,如果您希望保持函数整洁(只需看一下函数语言),就需要确保函数没有副作用。
这取决于上下文。
在类似Pascal的语言中,函数和过程是不同的实体,不同之处在于它们是否返回值。他们的行为不同。语言语法(例如,过程调用表单语句;您不能在表达式内部使用过程调用,而函数调用则不能在表单语句中使用,您必须在其他语句中使用它们)。因此,帕斯卡(Pascal)的程序员可以区分这些。
在类似C的语言和许多其他当代语言中,这种区别消失了。在静态类型语言中,过程只是具有有趣返回类型的函数。这可能就是为什么它们可以互换使用的原因。
在函数式语言中,通常没有诸如过程之类的东西-一切都是函数。
在C中的示例:
// function
int square( int n ) {
return n * n;
}
// procedure
void display( int n ) {
printf( "The value is %d", n );
}
尽管您应该注意,C标准并未讨论过程,但仅涉及函数。
void function
。Kernighan&Ritchie Ch 1.7:“在C语言中,函数等效于Fortran中的子例程或函数,或者在Pascal中等效于过程或函数。” 换句话说...这个答案是错误的。
SELECT
以及DML( ,INSERT
,UPDATE
),DELETE
则它的语句,而功能只允许SELECT
声明它。SELECT
语句中使用,而函数可以嵌入在SELECT
语句中。WHERE
(或a HAVING
或a SELECT
)块中的任何地方,都不能在SQL语句中使用存储过程,而可以使用函数。JOIN
其他表的块中使用。JOIN
块和其他行集操作中使用。更严格地讲,如果x = y,则函数f服从f(x)= f(y)的属性,即,每次使用相同的参数调用该函数时,它都会计算出相同的结果(因此,该函数不会更改其状态)。系统。)
因此,rand()或print(“ Hello”)等不是函数,而是过程。虽然sqrt(2.0)应该是一个函数:不管有多少次调用它,都不会产生明显的效果或状态变化,并且总是返回1.41和某些值。
如果我们在这里与语言无关,那么过程通常会指定一系列操作,这些操作需要可靠且幂等地实现某些结果。即,过程基本上是算法。
另一方面,函数是较大程序中有点独立的代码。换句话说,功能是程序的实现。
这是一个众所周知的老问题,但是我想分享一些有关现代编程语言研究和设计的更多见解。
传统上(在结构化编程的意义上)和非正式地,过程是具有“输入”并执行某些可编程操作的可重用结构构造。当需要在过程中完成某些操作时,可以在源代码(通常是一种表达式)中编码的过程调用中提供该过程的(实际)参数,并在过程主体中提供操作(提供)在程序的定义中)将执行,并将参数替换为主体中使用的(形式)参数。
甲函数超过因为程序的返回值也可以被指定为在体内的“输出”。函数调用与过程调用大致相同,不同之处在于,您还可以在语法上使用函数调用的结果(通常用作其他表达式的子表达式)。
传统上,过程调用(而不是函数调用)用于指示没有输出一定是令人感兴趣的,并且必须有副作用以避免调用成为无操作,因此强调了命令式编程范例。许多传统的编程语言(例如Pascal)都提供“过程”和“功能”,以区分这种故意的样式差异。
(显然,上述“输入”和“输出”是基于函数的语法属性的简化概念。许多语言还支持通过引用/共享将参数传递给参数,以允许用户在调用过程中传输以参数编码的信息该参数甚至可以称为“输入/输出参数”。此功能基于调用中传递的对象的性质,该性质与过程/功能的特征的属性正交。)
但是,如果不需要函数调用的结果,则可以(至少在逻辑上)忽略它,并且函数定义/函数调用应以这种方式与过程定义/过程调用一致。类似于C,C ++和Java的类似于ALGOL的语言都以这种方式提供“函数”的功能:通过将结果类型编码void
为类似于传统过程的函数的特例,无需提供“过程”功能”。这样可以防止语言设计出现膨胀。
由于提到了SICP,因此还值得注意的是,在R n RS指定的方案语言中,过程可能必须也可能不必返回计算结果。这是传统的“函数”(返回结果)和“过程”(不返回任何结果)的结合,与许多类似ALGOL的语言的“函数”概念基本相同(并且实际上共享了更多的保证,例如对应用程序的评估)。调用前的操作数)。但是,即使在诸如SRFI-96之类的规范性文件中,仍会出现旧式差异。
我对这种差异背后的确切原因并不十分了解,但是据我所知,如今的语言设计师似乎会更加高兴,而不会出现规范膨胀。即,不需要“程序”作为独立功能。诸如void
type之类的技术已经足以标记应强调副作用的用途。对于拥有数十年来流行的类C语言经验的用户来说,这也更为自然。而且,它避免了像R n RS这样的情况下的尴尬,在这种情况下,“过程”实际上是广义上的“功能”。
从理论上讲,可以使用指定的单元类型指定一个函数作为函数调用结果的类型,以表明结果是特殊的。这将传统过程(呼叫结果不感兴趣)与其他过程区分开来。语言的设计风格不同:
#inert
)也适用。void
ALGOL的语言中的类型正是这种技术的一个示例。ISO C11 _Noreturn
是类似但更微妙的一种。作为从数学派生的传统概念,大多数人不介意知道大量的黑魔法。严格来说,按照数学书籍,您不太可能将所有事情弄清楚。CS书籍也可能没有太大帮助。
关于编程语言,有一些警告:
{{{}}, {}}
……)。。内部过程中,我们可以使用DML(Insert / Update / Delete)语句,但是内部函数中,我们不能使用DML语句。
过程可以同时具有输入\输出参数,但是功能只能具有输入参数。
我们可以在存储过程中使用Try-Catch块,但是在功能上我们不能使用Try-Catch块。
我们不能在Select语句中使用存储过程,但是在函数中我们可以在Select语句中使用。
存储过程可以返回0或n个值(最大1024个),但是函数只能返回1个强制性值。
不能从Function调用存储过程,但是我们可以从Stored Procedure调用函数。
我们可以在存储过程中使用事务,但是在函数中我们不能使用事务。
我们无法在Where / Having / select部分的任何地方使用Sql语句中的存储过程,但可以使用In函数。
我们不能加入存储过程,但是我们可以加入函数。
有关更多..请单击此处... http://dotnet-developers-cafe.blogspot.in/2013/08/difference-between-stored-procedure-and.html
一个函数返回一个值,而一个过程仅执行命令。
名称函数来自数学。用于基于输入来计算值。
过程是可以按顺序执行的一组命令。
在大多数编程语言中,甚至函数也可以具有一组命令。因此,区别仅在于返回值部分。
但是,如果您希望保持函数整洁(只需看一下函数语言),就需要确保函数没有副作用。
在大多数答案中,我不停地反复看到一些东西,那就是使函数成为函数的原因是它返回一个值。
函数不仅仅是返回值的任何旧方法。并非如此:为了使方法成为实函数,它必须始终在给定特定输入的情况下返回相同的值。不是函数的方法的一个示例是random
方法的大多数语言中方法,因为尽管它确实返回一个值,但该值并不总是相同的。
因此,函数更类似于地图(例如,x -> x'
一维函数在哪里)。这是常规方法与函数之间的一个非常重要的区别,因为在处理实函数时,对它们的时间安排和评估顺序应该无关紧要,因为非函数并不总是这样。
这是不是函数的方法的另一个示例,但该方法仍将返回值。
// The following is pseudo code:
g(x) = {
if (morning()) {
g = 2 * x;
}
else {
g = x;
}
return g;
}
我进一步反对过程不返回值的观点。过程只是讨论函数或方法的一种特定方式。因此,这意味着如果您的过程定义或实现的基础方法返回一个值,那么请猜测该过程将返回一个值。以SICP中的以下代码段为例:
// We can immediately translate this definition into a recursive procedure
// for computing Fibonacci numbers:
(define (fib n)
(cond ((= n 0) 0)
((= n 1) 1)
(else (+ (fib (- n 1))
(fib (- n 2))))))
您最近是否听说过递归程序?他们在谈论递归函数(一个实函数),并且正在返回一个值,并且他们使用的是“过程”一词。那有什么区别呢?
关于函数的另一种思考方式(除上述含义之外)是作为诸如数字1的理想的抽象表示。过程是该事物的实际实现。我个人认为它们是可以互换的。
(请注意,如果您从我提供的链接中阅读了该章,您可能会发现,要理解一个较难的概念不是函数和过程之间的区别,而是过程和过程之间的区别。您知道递归过程可以具有迭代过程?)
程序的类似物是配方。例如; 假设您有一台名为make-pies
该机器的机器,该机器接受的成分,(fruit, milk, flower, eggs, sugar, heat)
并且该机器返回pie
。
这台机器的表示可能看起来像
make-pies (fruit, milk, flower, eggs, sugar, heat) = {
return (heat (add fruit (mix eggs flower milk)))
}
当然,这不是做馅饼的唯一方法。
在这种情况下,我们可以看到:
A function is to a machine
as a procedure is to a recipe
as attributes are to ingredients
as output is to product
这样的类比是可以的,但是当您考虑到处理计算机程序时,所有东西都是抽象的,因此它可以分解。因此,与在机器上使用配方不同的是,我们正在比较本身就是抽象的两件事。两件事可能是同一件事。我认为,它们(出于所有意图和目的)都是同一件事。
过程:1. 过程是定义参数化计算的语句的集合。2.过程不能返回值。
3.无法从函数调用过程。
函数 1. 函数在结构上类似于过程,但在语义上基于数学函数建模。2.它可以返回值。3.可以从程序中调用函数。
过程和函数都是子例程,它们之间的唯一区别是过程返回多个(或至少可以做到)值,而函数只能返回一个值(这就是为什么在数学中使用函数表示法的原因,因为通常只找到一个值在某一特定时间)尽管某些编程语言未遵循这些规则,但这是它们的真实定义
return
什么都没有。您正在谈论的是副作用,两者都可能发生(如果语言允许)。