fbpx
维基百科

頭等物件

頭等物件(英語:First-class object),在電腦科學中,指称支持其他实体通常能获得的所有运算的实体。这些运算典型的包括:在執行期創造,作為參數傳遞給其他函數,或存入一個變數[1]。將一個實體變為頭等物件的過程叫做「物件化」(Reification)[2]

「頭等物件」這一名稱最早由克里斯托弗·斯特雷奇在1960年代發明,原稱「頭等公民」(First-class citizen),意指函數可作為電腦語言中的頭等公民。英文中也稱「First-class entity」或「First-class value」。

历史

头等对象和二等对象的概念,在1960年由克里斯托弗·斯特雷奇引入。[3][4] 实际上他并没有给出严格的术语定义,而是给出了ALGOL语言中实数和过程的对比:

头等对象和二等对象。在Algol程序语言中,一个“实数”可能会出现在一个表达式中或被赋给一个变量,并可能在过程调用中作为实际参数出现。而“过程”只可能会出现在另一个过程调用中,最常见的是作为操作符,有时候也作为实参。除此之外,没有表达式会涉及到过程,或者将过程作为计算结果。因此在某种意义上,在Algol程序语言中的过程是二等公民,它们总是会单独出现,不可能被一个表达式或一个变量表示(形式参数除外)…[5]

在1990年代,拉斐尔·芬克尔英语Raphael Finkel提出了二等值和三等值的定义[6],但这些定义尚未被广泛采用。[7]

定義

頭等物件不一定是物件導向程式設計所指的物件,而可以指任何程式中的實體。Robin Popplestone英语Robin Popplestone给出如下定义:

  1. 所有项目都有特定的基本权力。
  2. 所有项目都可以作为函数的实际参数。
  3. 所有项目都可以作为函数的结果返回。
  4. 所有项目都可以是赋值语句的主体。
  5. 所有项目都可以等式测试。[8]

範例

最简单的标量数据类型,比如整数和浮点数,几乎总是头等的。在很多较早的语言中,数组和字符串不是头等的:它们不能被作为赋值的对象,或作为形式参数传递给子例程。例如,FORTRAN IVC都不支持数组赋值,并且它们在作为形式参数传递的时候,实际上只有它们的第一个元素的位置被传递了,它们的大小失去了。C看起来支持数组指针的复制,但实际上它们只是到数组的第一个元素的指针,仍然不承载这个数组的大小。

不同語言中對函數的區別很大,例如C語言C++中的函數不是頭等物件,因為在這些語言中函數不能在執行期創造,而必須在設計時全部寫好。相比之下,Scheme中的函數是頭等物件,因為可以用lambda表达式來創造匿名函數並作為頭等物件來操作。

概念 描述 语言
头等函数 闭包匿名函数 Dart, Scheme, ML, Haskell, F#, Kotlin, Scala, Swift, Perl, PHP, Python, Raku, JavaScript, Delphi, Rust
头等控制 续体 Scheme, ML, F#
头等类型 依赖类型 Coq, Idris, Agda
头等数据类型 Generic Haskell, C++11
头等多态 非直谓多态
头等消息英语first-class message 动态消息(方法调用) Smalltalk,[9] Objective-C[9]
头等类 元类 Smalltalk, Objective-C, Ruby, Python, Delphi
头等证明 证明对象[10] Coq, Agda

参考文献

  1. ^ Scott, Michael. Programming Language Pragmatics. San Francisco, CA: Morgan Kaufmann Publishers. 2006: 140. 
  2. ^ J. Malenfant, M. Jacques and F.-N. Demers. . parc.com. [2010-10-09]. (原始内容存档于2010-05-28). 
  3. ^ Rod Burstall, "Christopher Strachey—Understanding Programming Languages", Higher-Order and Symbolic Computation 13:52 (2000)
  4. ^ Harold Abelson; Gerald Jay Sussman. 章节1.3.4 脚注64. 2. [2015-03-03]. (原始内容存档于2015-03-09) (英语). 
  5. ^ Christopher Strachey, "Fundamental Concepts in Programming Languages" in Higher-Order and Symbolic Computation 13:11 (2000); though published in 2000, these are notes from lectures Strachey delivered in August, 1967
  6. ^ R. Finkel. Advanced Programming language Design. : 73 (英语). 
  7. ^ Norman Ramsey. About first-,second- and third-class value. Stackoverflow. [14 September 2013] (英语). 
  8. ^ R. J. Popplestone: The Design Philosophy of POP-2. in: D. Michie: Machine Intelligence 3, Edinburgh at the University Press, 1968
  9. ^ 9.0 9.1 Paritosh Shroff, Scott F. Smith. Type Inference for First-Class Messages with Match-Functions (页面存档备份,存于互联网档案馆
  10. ^ Bove, Ana; Dybjer, Peter. Dependent Types at Work (PDF). Language Engineering and Rigorous Software Development. 2009, 5520: 57–99 [8 June 2015]. doi:10.1007/978-3-642-03153-3_2. (原始内容 (PDF)于April 2, 2014).  (also archived (页面存档备份,存于互联网档案馆))

頭等物件, 英語, first, class, object, 在電腦科學中, 指称支持其他实体通常能获得的所有运算的实体, 这些运算典型的包括, 在執行期創造, 作為參數傳遞給其他函數, 或存入一個變數等, 將一個實體變為的過程叫做, 物件化, reification, 這一名稱最早由克里斯托弗, 斯特雷奇在1960年代發明, 原稱, 頭等公民, first, class, citizen, 意指函數可作為電腦語言中的頭等公民, 英文中也稱, first, class, entity, first, class,. 頭等物件 英語 First class object 在電腦科學中 指称支持其他实体通常能获得的所有运算的实体 这些运算典型的包括 在執行期創造 作為參數傳遞給其他函數 或存入一個變數等 1 將一個實體變為頭等物件的過程叫做 物件化 Reification 2 頭等物件 這一名稱最早由克里斯托弗 斯特雷奇在1960年代發明 原稱 頭等公民 First class citizen 意指函數可作為電腦語言中的頭等公民 英文中也稱 First class entity 或 First class value 目录 1 历史 2 定義 3 範例 4 参考文献历史 编辑头等对象和二等对象的概念 在1960年由克里斯托弗 斯特雷奇引入 3 4 实际上他并没有给出严格的术语定义 而是给出了ALGOL语言中实数和过程的对比 头等对象和二等对象 在Algol程序语言中 一个 实数 可能会出现在一个表达式中或被赋给一个变量 并可能在过程调用中作为实际参数出现 而 过程 只可能会出现在另一个过程调用中 最常见的是作为操作符 有时候也作为实参 除此之外 没有表达式会涉及到过程 或者将过程作为计算结果 因此在某种意义上 在Algol程序语言中的过程是二等公民 它们总是会单独出现 不可能被一个表达式或一个变量表示 形式参数除外 5 在1990年代 拉斐尔 芬克尔 英语 Raphael Finkel 提出了二等值和三等值的定义 6 但这些定义尚未被广泛采用 7 定義 编辑頭等物件不一定是物件導向程式設計所指的物件 而可以指任何程式中的實體 Robin Popplestone 英语 Robin Popplestone 给出如下定义 所有项目都有特定的基本权力 所有项目都可以作为函数的实际参数 所有项目都可以作为函数的结果返回 所有项目都可以是赋值语句的主体 所有项目都可以等式测试 8 範例 编辑最简单的标量数据类型 比如整数和浮点数 几乎总是头等的 在很多较早的语言中 数组和字符串不是头等的 它们不能被作为赋值的对象 或作为形式参数传递给子例程 例如 FORTRAN IV和C都不支持数组赋值 并且它们在作为形式参数传递的时候 实际上只有它们的第一个元素的位置被传递了 它们的大小失去了 C看起来支持数组指针的复制 但实际上它们只是到数组的第一个元素的指针 仍然不承载这个数组的大小 不同語言中對函數的區別很大 例如C語言與C 中的函數不是頭等物件 因為在這些語言中函數不能在執行期創造 而必須在設計時全部寫好 相比之下 Scheme中的函數是頭等物件 因為可以用lambda表达式來創造匿名函數並作為頭等物件來操作 概念 描述 语言头等函数 闭包和匿名函数 Dart Scheme ML Haskell F Kotlin Scala Swift Perl PHP Python Raku JavaScript Delphi Rust头等控制 续体 Scheme ML F 头等类型 依赖类型 Coq Idris Agda头等数据类型 Generic Haskell C 11头等多态 非直谓多态头等消息 英语 first class message 动态消息 方法调用 Smalltalk 9 Objective C 9 头等类 元类 Smalltalk Objective C Ruby Python Delphi头等证明 证明对象 10 Coq Agda参考文献 编辑 Scott Michael Programming Language Pragmatics San Francisco CA Morgan Kaufmann Publishers 2006 140 J Malenfant M Jacques and F N Demers A Tutorial on Behavioral Reflection and its Implementation parc com 2010 10 09 原始内容存档于2010 05 28 Rod Burstall Christopher Strachey Understanding Programming Languages Higher Order and Symbolic Computation 13 52 2000 Harold Abelson Gerald Jay Sussman 章节1 3 4 脚注64 Structure and Interpretation of Computer Programs 计算机程序的构造和解释 2 2015 03 03 原始内容存档于2015 03 09 英语 Christopher Strachey Fundamental Concepts in Programming Languages in Higher Order and Symbolic Computation 13 11 2000 though published in 2000 these are notes from lectures Strachey delivered in August 1967 R Finkel Advanced Programming language Design 73 英语 Norman Ramsey About first second and third class value Stackoverflow 14 September 2013 英语 R J Popplestone The Design Philosophy of POP 2 in D Michie Machine Intelligence 3 Edinburgh at the University Press 1968 9 0 9 1 Paritosh Shroff Scott F Smith Type Inference for First Class Messages with Match Functions 页面存档备份 存于互联网档案馆 Bove Ana Dybjer Peter Dependent Types at Work PDF Language Engineering and Rigorous Software Development 2009 5520 57 99 8 June 2015 doi 10 1007 978 3 642 03153 3 2 原始内容存档 PDF 于April 2 2014 also archived 页面存档备份 存于互联网档案馆 取自 https zh wikipedia org w index php title 頭等物件 amp oldid 74497674, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。