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

时间:2012-05-27 21:12:40

标签: scala functional-programming

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

6 个答案:

答案 0 :(得分:19)

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

  1. 可以使用,没有限制,只要“普通”值可以,即从函数传递和返回,放入容器等。

  2. 它可以构造,没有限制,只要“普通”值可以,即在本地,在表达式等中。

  3. 它可以以类似于“普通”值的方式键入,即,有一个类型分配给这样的实体,并且它可以与其他类型自由组合。 / p>

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

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

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

    • 同样,数组和结构在C land中不是一流的。

    • Scala中的类不是一流的。你可以定义和嵌套它们,但不是将它们传递给一个函数(只有它的实例)。有一流的OO语言,实际上,通知Scala设计的所谓nuObj微积分也允许这样做。

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

答案 1 :(得分:13)

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

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

>>> def add2(x):
...   return x + 2
... 
>>> map(add2, [1, 2, 3])
[3, 4, 5]

答案 2 :(得分:6)

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

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

所以你可以填补空白,说某些语言支持使用某种特定的东西作为价值观。例如,Scala具有第一类函数(或函数是Scala中的值):

def plusOne(x : Int) = x + 1
val func : Int => Int = plusOne
println(func(1))     // prints 2

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

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

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

答案 3 :(得分:3)

这意味着函数是一个对象。就像任何其他对象一样,它可以分配给变量,或传递给函数,或者对象可以执行的任何其他操作。

例如,这是一个变量f,它包含一个向整数加1的函数对象:

scala> val f = (n: Int) => n + 1
f: Int => Int = <function1>       // Has type Int => Int; Int input, Int output

它可以作为参数传递给map的{​​{1}}函数:

List[Int]

答案 4 :(得分:2)

这个术语取自纯函数语言,如Haskell或Erlang,其中函数是一等公民。这意味着函数可以作为参数传递给其他函数,函数可以返回其他函数。

因为函数是一等公民 - 我们有一个函数类型 - 用箭头表示。在haskel中:( - &gt;)在skala:(=&gt;)

考虑地图功能。它是一个以函数和列表作为参数的函数,并将给定函数应用于列表的所有元素:

在haskell中:

map(\x->x+1)[1,2,3] 
= [2,3,4]
scala中的

List(1,2,3) map (x => x + 1) 
= [2,3,4]

(\x->x+1)(x => x + 1)是作为参数传递给map函数的函数(用lambda表达式表示)。

答案 5 :(得分:0)

在函数式编程中,函数可以分配给变量,作为参数传递给其他函数,并作为其他函数的值返回。这些函数称为 First Class Functions 。高阶函数是一个函数,它将函数作为参数或返回函数。

示例:

var increase = (x: Int) => x + 1