"功能是一流的价值"这究竟意味着什么?

Ani*_*nil 18 functional-programming scala

有人可以用一些好的例子清楚地解释它.在解释函数式编程时,我在Scala中遇到了这个声明.

And*_*erg 20

"一流"不是一个正式定义的概念,但它通常意味着一个实体有三个属性:

  1. 它可以无限制地用于 "普通"值可以,即从函数传递和返回,放入容器等的任何地方.

  2. 它可以在没有限制的情况下构建,只要"普通"值可以,即在本地,在表达式等中.

  3. 它可以以类似于"普通"值的方式键入,即,存在分配给这样的实体的类型,并且它可以与其他类型自由组合.

对于函数,(2)特别暗示局部函数可以使用范围内的所有名称,即你有词法闭包.它通常还带有一个用于构造的匿名表单(例如匿名函数),但这并不是严格要求的(例如,如果语言具有足够通用的let表达式).Point(3)在无类型语言中非常简单.

所以你明白为什么Scala(和函数语言)中的函数被称为一流函数.以下是其他一些例子.

  • C/C++中的函数不是一流的.虽然(1)和(3)可以通过函数指针获得,但(2)不适用于函数.(这一点经常被忽视.)

  • 同样,数组和结构在C语言中不是一流的.

  • Scala中的类不是一流的.您可以定义和嵌套它们,但不能将它们传递给函数(仅限其实例).有OO语言和一流的类,事实上,所谓的nuObj演算也为Scala的设计提供了依据.

  • 一流模块是ML类语言中经常需要的功能.它们很难,因为它们导致不可判断的类型检查.一些ML方言允许模块被包装为一等值,但可以说,这并不会使模块本身成为一流的.


Ign*_*ams 13

这意味着函数可以以与整数,序列等相同的方式传递.

一个例子(虽然不是Scala):

>>> def add2(x):
...   return x + 2
... 
>>> map(add2, [1, 2, 3])
[3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

  • scala示例可以是`def f(x:Int)= x +2; 阵列(1,2,3).MAP(F)` (3认同)

Ben*_*Ben 6

任何编程语言都有一组基本的语言功能,您可以使用它们来操作值,以便编写程序.这些是:"将值传递给函数","将变量绑定到值,然后将变量用作值",等等.

每当您看到声称某种语言具有"X作为第一类值"或具有"第一类X"时,这意味着该语言允许您在X上使用这些基本语言功能.另一种说法是语言将X视为值.

因此,您可以填写空白,说某些语言支持使用某种特定类型的东西作为值.例如,Scala具有第一类函数(或函数是Scala中的值):

def plusOne(x : Int) = x + 1
val func : Int => Int = plusOne
println(func(1))     // prints 2
Run Code Online (Sandbox Code Playgroud)

Python具有一流的函数,但也有一流的(类是Python中的值):

class Foo(object):
    def __init__(self, thing):
        self.thing = thing

cls = Foo
instance = cls(5)
print instance.thing            # prints 5
print isinstance(thing, cls)    # prints True
print isinstance(thing, Foo)    # prints True
Run Code Online (Sandbox Code Playgroud)

这可能看起来并不多,但任何编程语言的基本特征都说明了你可以用价值观做些什么来导致更多东西; 如果你可以使用函数作为值,那么(像任何其他值一样)你可以将它们放在容器中,通过调用其他代码等来检索未知的函数等.

相比之下,Java并没有具备一流的功能.您不能将函数放在变量中,将一个函数传递给另一个函数,或者将一个函数作为函数的返回值.函数不是Java中的值.Java也没有一流的类.