Programming languages 和一个命名函数。

Programming languages 和一个命名函数。,programming-languages,functional-programming,oop,smalltalk,Programming Languages,Functional Programming,Oop,Smalltalk,一种语言并不是通过命名函数而成为一种函数式语言——根据这个定义,C是函数式的!更重要的是数学意义上的函数语义,即结果仅取决于参数(特别是:没有副作用)。根据这个定义,可以由setter修改的对象与函数式编程风格相反。然而,正如已经指出的,如果您禁止副作用,即使对象也可以在函数样式(矩形示例)中使用。 顺便说一句,具有方法的对象和在私有状态上的闭包中定义的一组函数之间存在二元性(有关详细信息,请参见SICP)。它们可以相互模拟: (def (make_foo initVal1 ... initVa

一种语言并不是通过命名函数而成为一种函数式语言——根据这个定义,C是函数式的!更重要的是数学意义上的函数语义,即结果仅取决于参数(特别是:没有副作用)。根据这个定义,可以由setter修改的对象与函数式编程风格相反。然而,正如已经指出的,如果您禁止副作用,即使对象也可以在函数样式(矩形示例)中使用。 顺便说一句,具有方法的对象和在私有状态上的闭包中定义的一组函数之间存在二元性(有关详细信息,请参见SICP)。它们可以相互模拟:

(def (make_foo initVal1 ... initValN)
   (let ((instVar1 initVal1) ... (instVarN initValN))
      (define (method1 args) ...)
      ...
      (define (methodN args) ...)
      (define (lookup selector)
          (cond ((eq? selector 'method1) method1)
             ...
             ((eq? selector 'methodN) methodN)
             (true doesNotUnderstandCode)))
      lookup)) ; returns the lookup function (provides "access into the closure") !

(defMacro (method1 receiver.args)
    ((receiver selector) args))

(define foo (make_foo 1 2 ...))
(method1 foo ...)
上面是对“纯”函数对象的模拟,在语义上与许多Smalltalk代码相同!但是,要实现setter方法,必须添加一个执行(set!instVar newValue)的方法。而且,因为设置!是非功能性的,破坏方案的“功能性”

总结:卢克,看语义,而不是来源

我看到他们之间有一些相似之处 Smalltalk和FPL,即闭包

还有一个更基本的相似性——每个Smalltalk消息都会返回一个值

但是现在看看

[Smalltalk]发送用户的名称 所需的操作,以及任何 参数,作为数字的消息, 了解到 接受者最知道如何执行 所需的操作

这描述了你认为的函数式编程吗

@Frank Shearr-这是对Erlang的描述 也Erlang现在不起作用了吗


Erlang有点像一种幻想——顺序编程基于函数,而并发编程基于进程之间的消息传递。因此,Erlang不是多范式或混合语言,其他语言允许使用不同的样式来实现相同的目的——它使用不同的样式来实现不同的目的。

谢谢大家的回答

我将在这里添加我的,这基本上是我(可能错过)对你的理解

我认为,所谓OO或FP的标准是它们使用语言构建“东西”的方式;我的意思是,做这件事并不是那么容易或难,而是使用了思维范式

例如,如链接所示,在Scala中键入内容可能比在OCaml中键入内容更困难,但这并不意味着它的FPL更少(可能不完整或不纯净,但肯定是功能性的);因为Scala的目标是将函数用作主要构建块,而不是对象

另一方面,如果风格或目标是使用其他工件,那么简单地用一种语言编写函数并不能使其具有功能。例如,Smalltalk使编写匿名块或提供可插入排序比较器变得非常容易,但这并不能使它发挥任何功能,因为它的重点是使用对象和传递消息。BlockCloses只是一种对这些消息(而不是函数)进行编码的机制,即使它们看起来就像函数一样

混淆就来了,因为OO和FP是正交的(如通过twitter所述),所以,Smalltalk中的编码消息看起来很像Scala中的匿名函数。但做类似的事情并不能将一种范式的语言转换成另一种范式

<> P>为了使它更糟,斯卡拉也使用OO范式,使主流(java、C++、C)程序员更容易跳出,如果你看到,它比其他FPL的方式有更大的成功。当然,这要感谢Java(如果Clojure获得成功,那么JVM也是出于同样的原因)

总之:一种编程语言可以根据它用来构建“事物”的范式进行分类。有一些语言是纯的[ SimalTalk:OO,Haskell:函数,C:程序],或者混合,像斯卡拉或多范式,如C++,露比,Python。 事实上,你可以用另一种语言写一种风格,这并不意味着它就是那种风格的语言。就像用Lisp模拟对象一样,它既不能成为OO,也不能用Java函数实现功能


为了回答这个问题,Smalltalk需要将函数用作构建块,而不是因为它使用对象

因为Smalltalk是面向对象语言的典范?能够将函数作为一类对象使用并不能使语言具有“功能性”,正如能够编写过程使语言具有“程序性”一样。@Gabe:有些人可能会认为,单凭这一个属性就足以使一种语言具有“功能性”函数式编程语言“tag.@CurtainDog:OO和functional并不是相互排斥的范例。@CurtainDog这是一个很好的学术立场,但实际上毫无意义:我不是在谈论有人写的论文,我是在谈论小人是如何使用对象进行实际写作的,这是一种非常实用的方式。方法没有副作用,方法/闭包作为一级实体(对象,就像另一种函数式编程语言CommonLisp一样)。考虑到Smalltalk强大的Lisp影响力,这并不奇怪。事实上,Smalltalk几乎是一种功能性语言。Smalltalk的一些扩展提供了功能模式匹配,例如。此外,Newspeak()是一种以Self和Smalltalk为传统的编程语言,它的核心概念之一是支持不变性。这一定义是否使C#、Javascript和本世纪几乎所有语言都具有功能性?@Diego:正如我所说,“功能性编程语言”一词没有公认的定义。所以,根据第一个定义,是的。根据第二个定义,没有。@Missing Faktor-Smalltalk是否提供了一种声明命名函数的方法?@AngelO'Sphere,我非常熟悉什么是第一类函数。(Scala和Haskell是我的首席
|func v|
func := [:x | x + 1].
v := func value: 5.
|func v|
func := [:x | x + 1].
func := 2.
v := func value: 5.
(def (make_foo initVal1 ... initValN)
   (let ((instVar1 initVal1) ... (instVarN initValN))
      (define (method1 args) ...)
      ...
      (define (methodN args) ...)
      (define (lookup selector)
          (cond ((eq? selector 'method1) method1)
             ...
             ((eq? selector 'methodN) methodN)
             (true doesNotUnderstandCode)))
      lookup)) ; returns the lookup function (provides "access into the closure") !

(defMacro (method1 receiver.args)
    ((receiver selector) args))

(define foo (make_foo 1 2 ...))
(method1 foo ...)