text:
Giun nhung
Bách khoa toàn thư mở Wikipedia
Giun nhung (Onychophora, còn được gọi là Protracheata) là một ngành nhỏ của siêu ngành động vật lột xác với ~ 180 loài. Những sinh vật phân đốt mờ này[2] có mắt, râu nhỏ, nhiều đôi chân và các tuyến chất nhờn.[3] Hầu hết phổ biến ở các vùng nhiệt đới của Nam bán cầu, săn động vật nhỏ hơn như côn trùng, mà chúng bắt bởi một tia chất nhờn dính. Trong động vật học hiện đại, chúng đặc biệt nổi tiếng với hành vi sinh sản kỳ lạ của chúng và noãn thai sinh.
Phân loại[sửa | sửa mã nguồn]
- Ngành Onychophora
- Lớp Onychophorida
- Bộ † Paronychophora (tuyệt chủng)
- Họ † Onychodictyidae
- Chi † Onychodictyon
- Họ † Onychodictyidae
- Bộ Euonychophora
- Họ Peripatidae
- Họ Peripatopsidae
- Chi: Acanthokara, Aethrikos, Akthinothele, Anoplokaros, Austroperipatus, Baeothele, Centrorumis, Cephalofovea, Critolaus, Dactylothele, Dystactotylos, Euperipatoides, Florelliceps, Hylonomoipos, Konothele, Lathropatus, Leuropezos, Mantonipatus, Metaperipatus, Minyplanetes, Nodocapitus, Occiperipatoides, Ooperipatellus, Ooperipatus, Opisthopatus, Paraperipatus, Paropisthopatus, Peripatoides, Peripatopsis, Phallocephale, Planipallipus, Regimitra, Ruhbergia, Sphenoparme, Symperipatus, Tasmania, Tasmanipatus, Tetrameraden, Vescerro, Wambalana
- Họ † incertae sedis
- Chi † Helenodora
- Bộ † Paronychophora (tuyệt chủng)
- Lớp Onychophorida
Tham khảo[sửa | sửa mã nguồn]
- ^
Hoàn thành chú thích này
- ^ Holm, E.; Dippenaar-Schoeman, A. (2010). The Arthropods of Southern Africa. ISBN 978-0-7993-4689-3.
- ^ Prothero, D. R.; Buell (llustrator), C. D. (2007). Evolution: What the Fossils Say and Why It Matters. New York: Columbia University Press. tr. 193. ISBN 0-231-13962-4.
Liên kết ngoài[sửa | sửa mã nguồn]
- Giun nhung tại Encyclopedia of Life
- Giun nhung tại trang Trung tâm Thông tin Công nghệ sinh học quốc gia Hoa Kỳ (NCBI).
- Giun nhung 154431 tại Hệ thống Thông tin Phân loại Tích hợp (ITIS).
- Discovery of Eoperipatus sp. (Peripatidae), the first representative of Onychophora in Vietnam Thai Tran Bai, Nguyen Duc Anh, Tạp chí Sinh học T. 32, S. 4 (2010) Eoperipatus totoro
- Phát hiện loài Eoperipatus sp. (Peripatidae), đại diện đầu tiên của động vật ngành có móc (Onychophora) ở Việt Nam Pdf

markdown:
# Giun nhung
Bách khoa toàn thư mở Wikipedia
|Giun nhung|
|Thời điểm hóa thạch: 40–0Ma
|
|
|![]()
[Phân loại khoa học](/wiki/Ph%C3%A2n_lo%E1%BA%A1i_sinh_h%E1%BB%8Dc) [Giới](/wiki/Gi%E1%BB%9Bi_(sinh_h%E1%BB%8Dc))( *regnum*) [Animalia](/wiki/Animalia) [Phân giới](/wiki/Ph%C3%A2n_gi%E1%BB%9Bi)( *subregnum*) *Nhánh* [Bilateria](/w/index.php?title=%C4%90%E1%BB%99ng_v%E1%BA%ADt_%C4%91%E1%BB%91i_x%E1%BB%A9ng_hai_b%C3%AAn&action=edit&redlink=1) *Nhánh* [Nephrozoa](/w/index.php?title=Nephrozoa&action=edit&redlink=1) *Nhánh* [Protostomia](/wiki/%C4%90%E1%BB%99ng_v%E1%BA%ADt_mi%E1%BB%87ng_nguy%C3%AAn_sinh) [Liên ngành](/wiki/Li%C3%AAn_ng%C3%A0nh)( *superphylum*) *Nhánh* [Panarthropoda](/w/index.php?title=Panarthropoda&action=edit&redlink=1) [Ngành](/wiki/Ng%C3%A0nh_(sinh_h%E1%BB%8Dc))( *phylum*) **Onychophora** ![ Global range of Onychophora: Peripatidae in green, Peripatopsidae in red](//upload.wikimedia.org/wikipedia/commons/thumb/3/38/Onychophora_dis.png/280px-Onychophora_dis.png)
![ Global range of Onychophora: Peripatidae in green, Peripatopsidae in red](http://upload.wikimedia.org/wikipedia/commons/thumb/3/38/Onychophora_dis.png/280px-Onychophora_dis.png)
Global range of Onychophora: Peripatidae in green, Peripatopsidae in red
Sole class: Udeonychophora
[[1]](#cite_note-Jr2000-1)
- Bộ
[Euonychophora](/w/index.php?title=Euonychophora&action=edit&redlink=1)
- Họ
[Peripatidae](/w/index.php?title=Peripatidae&action=edit&redlink=1)
- Họ
[Peripatopsidae](/w/index.php?title=Peripatopsidae&action=edit&redlink=1)
- Họ
- Bộ †
[Ontonychophora](/w/index.php?title=Ontonychophora&action=edit&redlink=1)
- Họ †
[Helenodoridae](/w/index.php?title=Helenodoridae&action=edit&redlink=1)
- Họ †
[Tertiapatoidea](/w/index.php?title=Tertiapatoidea&action=edit&redlink=1)
- Họ †
**Giun nhung** ( **Onychophora**, còn được gọi là **Protracheata**) là một ngành nhỏ của siêu ngành động vật lột xác với ~ 180 loài. Những sinh vật phân đốt mờ này có mắt, râu nhỏ, nhiều đôi chân và các tuyến chất nhờn. [2] Hầu hết phổ biến ở các vùng nhiệt đới của Nam bán cầu, săn động vật nhỏ hơn như côn trùng, mà chúng bắt bởi một tia chất nhờn dính. Trong động vật học hiện đại, chúng đặc biệt nổi tiếng với hành vi sinh sản kỳ lạ của chúng và noãn thai sinh. [[3]](#cite_note-Prothero-3)
## Phân loại[
[sửa](/w/index.php?title=Giun_nhung&veaction=edit§ion=1) | [sửa mã nguồn](/w/index.php?title=Giun_nhung&action=edit§ion=1)]
- Ngành Onychophora
- Lớp Onychophorida
- Bộ †
[Paronychophora](/w/index.php?title=Paronychophora&action=edit&redlink=1)(tuyệt chủng)
- Họ †
[Onychodictyidae](/w/index.php?title=Onychodictyidae&action=edit&redlink=1)
- Chi †
[Onychodictyon](/w/index.php?title=Onychodictyon&action=edit&redlink=1)
- Chi †
- Họ †
- Bộ Euonychophora
- Họ
[Peripatidae](/w/index.php?title=Peripatidae&action=edit&redlink=1)
- Họ
[Peripatopsidae](/w/index.php?title=Peripatopsidae&action=edit&redlink=1)
- Chi:
*,* [Acanthokara](/w/index.php?title=Acanthokara&action=edit&redlink=1) *,* [Aethrikos](/w/index.php?title=Aethrikos&action=edit&redlink=1) *,* [Akthinothele](/w/index.php?title=Akthinothele&action=edit&redlink=1) *,* [Anoplokaros](/w/index.php?title=Anoplokaros&action=edit&redlink=1) *,* [Austroperipatus](/w/index.php?title=Austroperipatus&action=edit&redlink=1) *,* [Baeothele](/w/index.php?title=Baeothele&action=edit&redlink=1) *,* [Centrorumis](/w/index.php?title=Centrorumis&action=edit&redlink=1) *,* [Cephalofovea](/w/index.php?title=Cephalofovea&action=edit&redlink=1) *,* [Critolaus](/w/index.php?title=Critolaus_(velvet_worm)&action=edit&redlink=1) *,* [Dactylothele](/w/index.php?title=Dactylothele&action=edit&redlink=1) *,* [Dystactotylos](/w/index.php?title=Dystactotylos&action=edit&redlink=1) *,* [Euperipatoides](/w/index.php?title=Euperipatoides&action=edit&redlink=1) *,* [Florelliceps](/w/index.php?title=Florelliceps&action=edit&redlink=1) *,* [Hylonomoipos](/w/index.php?title=Hylonomoipos&action=edit&redlink=1) *,* [Konothele](/w/index.php?title=Konothele&action=edit&redlink=1) *,* [Lathropatus](/w/index.php?title=Lathropatus&action=edit&redlink=1) *,* [Leuropezos](/w/index.php?title=Leuropezos&action=edit&redlink=1) *,* [Mantonipatus](/w/index.php?title=Mantonipatus&action=edit&redlink=1) *,* [Metaperipatus](/w/index.php?title=Metaperipatus&action=edit&redlink=1) *,* [Minyplanetes](/w/index.php?title=Minyplanetes&action=edit&redlink=1) *,* [Nodocapitus](/w/index.php?title=Nodocapitus&action=edit&redlink=1) *,* [Occiperipatoides](/w/index.php?title=Occiperipatoides&action=edit&redlink=1) *,* [Ooperipatellus](/w/index.php?title=Ooperipatellus&action=edit&redlink=1) *,* [Ooperipatus](/w/index.php?title=Ooperipatus&action=edit&redlink=1) *,* [Opisthopatus](/w/index.php?title=Opisthopatus&action=edit&redlink=1) *,* [Paraperipatus](/w/index.php?title=Paraperipatus&action=edit&redlink=1) *,* [Paropisthopatus](/w/index.php?title=Paropisthopatus&action=edit&redlink=1) *,* [Peripatoides](/w/index.php?title=Peripatoides&action=edit&redlink=1) *,* [Peripatopsis](/w/index.php?title=Peripatopsis&action=edit&redlink=1) *,* [Phallocephale](/w/index.php?title=Phallocephale&action=edit&redlink=1) *,* [Planipallipus](/w/index.php?title=Planipallipus&action=edit&redlink=1) *,* [Regimitra](/w/index.php?title=Regimitra&action=edit&redlink=1) *,* [Ruhbergia](/w/index.php?title=Ruhbergia&action=edit&redlink=1) *,* [Sphenoparme](/w/index.php?title=Sphenoparme&action=edit&redlink=1) *,* [Symperipatus](/w/index.php?title=Symperipatus&action=edit&redlink=1) *,* [Tasmania](/w/index.php?title=Tasmania_(giun_nhung)&action=edit&redlink=1) *,* [Tasmanipatus](/w/index.php?title=Tasmanipatus&action=edit&redlink=1) *,* [Tetrameraden](/w/index.php?title=Tetrameraden&action=edit&redlink=1) *,* [Vescerro](/w/index.php?title=Vescerro&action=edit&redlink=1) [Wambalana](/w/index.php?title=Wambalana&action=edit&redlink=1)
- Chi:
- Họ †
[incertae sedis](/wiki/Incertae_sedis)
- Chi †
[Helenodora](/w/index.php?title=Helenodora&action=edit&redlink=1)
- Chi †
- Họ
- Bộ †
- Lớp Onychophorida
## Tham khảo[
[sửa](/w/index.php?title=Giun_nhung&veaction=edit§ion=2) | [sửa mã nguồn](/w/index.php?title=Giun_nhung&action=edit§ion=2)] [^](#cite_ref-Jr2000_1-0)
[Hoàn thành chú thích này](//vi.wikipedia.org/w/index.php?title=B%E1%BA%A3n_m%E1%BA%ABu:Ch%C3%BA_th%C3%ADch_DOI/10.1111.2Fj.1744-7410.2000.tb00178.x&preload=Bản_mẫu:Chú_thích_DOI/preload&editintro=Bản_mẫu:Chú_thích_DOI/editintro&action=edit) **Holm, E.; Dippenaar-Schoeman, A. (2010).** [^](#cite_ref-2) *The Arthropods of Southern Africa*. [ISBN](/wiki/ISBN) [978-0-7993-4689-3](/wiki/%C4%90%E1%BA%B7c_bi%E1%BB%87t:Ngu%E1%BB%93n_s%C3%A1ch/978-0-7993-4689-3). **Prothero, D. R.; Buell (llustrator), C. D. (2007).** [^](#cite_ref-Prothero_3-0) *Evolution: What the Fossils Say and Why It Matters*. New York: Columbia University Press. tr. 193. [ISBN](/wiki/ISBN) [0-231-13962-4](/wiki/%C4%90%E1%BA%B7c_bi%E1%BB%87t:Ngu%E1%BB%93n_s%C3%A1ch/0-231-13962-4).
## Liên kết ngoài[
[sửa](/w/index.php?title=Giun_nhung&veaction=edit§ion=3) | [sửa mã nguồn](/w/index.php?title=Giun_nhung&action=edit§ion=3)]
|
|![]()
|
| có thông tin sinh học về
|
|![]()
|Wikimedia Commons có thư viện hình ảnh và phương tiện truyền tải về
|[tại Encyclopedia of Life](http://www.eol.org/pages/6927) *Giun nhung* [Giun nhung](http://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?id=27563)tại trang [Trung tâm Thông tin Công nghệ sinh học quốc gia Hoa Kỳ](/wiki/Trung_t%C3%A2m_Th%C3%B4ng_tin_C%C3%B4ng_ngh%E1%BB%87_sinh_h%E1%BB%8Dc_qu%E1%BB%91c_gia_Hoa_K%E1%BB%B3)(NCBI). [tại](http://www.itis.gov/servlet/SingleRpt/SingleRpt?search_topic=TSN&search_value=154431) *Giun nhung*154431 [Hệ thống Thông tin Phân loại Tích hợp](/wiki/H%E1%BB%87_th%E1%BB%91ng_Th%C3%B4ng_tin_Ph%C3%A2n_lo%E1%BA%A1i_T%C3%ADch_h%E1%BB%A3p)(ITIS). [Discovery of](http://vjs.ac.vn/index.php/vjbio/article/view/718)Thai Tran Bai, Nguyen Duc Anh, Tạp chí Sinh học T. 32, S. 4 (2010) *Eoperipatus*sp. (Peripatidae), the first representative of Onychophora in Vietnam *Eoperipatus totoro* [Phát hiện loài](http://vjs.ac.vn/index.php/vjbio/article/view/718/1218) *Eoperipatus*sp. (Peripatidae), đại diện đầu tiên của động vật ngành có móc (Onychophora) ở Việt Nam

X-Cache: cp2001 miss, cp2019 miss


text:
Lập trình hàm
Trong ngành khoa học máy tính, lập trình hàm là một mô hình lập trình xem việc tính toán là sự đánh giá các hàm toán học và tránh sử dụng trạng thái và các dữ liệu biến đổi. Lập trình hàm nhấn mạnh việc ứng dụng hàm số, trái với phong cách lập trình mệnh lệnh, nhấn mạnh vào sự thay đổi trạng thái.[1] Lập trình hàm xuất phát từ phép tính lambda, một hệ thống hình thức được phát triển vào những năm 1930 để nghiên cứu định nghĩa hàm số, ứng dụng của hàm số, và đệ quy. Nhiều ngôn ngữ lập trình hàm có thể được xem là những cách phát triển giải tích lambda.[1]
Trong thực tế, sự khác biệt giữa hàm số toán học và cách dùng từ "hàm" trong lập trình mệnh lệnh đó là các hàm mệnh lệnh có thể tạo ra hiệu ứng lề, làm thay đổi giá trị của một phép tính trước đó. Vì vậy các hàm kiểu này thiếu tính trong suốt tham chiếu, có nghĩa là cùng một biểu thức ngôn ngữ lại có thể tạo ra nhiều giá trị khác nhau vào các thời điểm khác nhau tùy thuộc vào trạng thái của chương trình đang thực thi. Ngược lại, trong lập trình hàm, giá trị xuất ra của một hàm chỉ phụ thuộc vào các tham số đầu vào của hàm, vì thế gọi hàm f hai lần với cùng giá trị tham số x sẽ cho ra cùng kết quả f(x). Việc loại bỏ hiệu ứng lề có thể làm cho chương trình dễ hiểu hơn rất nhiều và người ta có dự đoán được hành vi của một chương trình, đó chính là một trong các động lực chính cho sự phát triển của lập trình hàm.[1]
Các ngôn ngữ lập trình hàm, đặc biệt là các loại thuần lập trình hàm, có ảnh hưởng lớn trong giới học thuật hơn là dùng để phát triển các phần mềm thương mại. Tuy vậy, các ngôn ngữ lập trình hàm nổi bật như Scheme,[2][3][4][5] Erlang,[6][7][8] Objective Caml,[9][10] và Haskell[11][12] đã được nhiều tổ chức khác nhau sử dụng trong các ứng dụng công nghiệp và thương mại. Lập trình hàm cũng được sử dụng trong công nghiệp thông qua các ngôn ngữ lập trình chuyên biệt như R (thống kê),[13][14] Mathematica (toán học hình thức),[15] J và K (phân tích tài chính)[cần dẫn nguồn], F# trong Microsoft.NET và XSLT (XML).[16][17] Các ngôn ngữ chuyên biệt dạng khai báo được sử dụng rộng rãi hiện nay như SQL và Lex/Yacc, cũng sử dụng một số thành phần của lập trình hàm, đặc biệt để tránh các giá trị biến đổi.[18] Các bảng tính (spreadsheet) cũng có thể được xem là các ngôn ngữ lập trình hàm.[19]
Lập trình theo phong cách lập trình hàm cũng có thể thực hiện ở các ngôn ngữ không được thiết kế riêng cho lập trình hàm. Ví dụ, ngôn ngữ lập trình mệnh lệnh Perl đã có một cuốn sách viết về cách áp dụng các khái niệm lập trình hàm vào đó.[20] JavaScript, một trong các ngôn ngữ được dùng nhiều hiện nay, có khả năng lập trình hàm.[21]
Mục lục
Các khái niệm[sửa | sửa mã nguồn]
Một số khái niệm và mô hình chỉ có ở lập trình hàm, và thường xa lạ với kiểu lập trình mệnh lệnh (bao gồm cả lập trình hướng đối tượng). Tuy nhiên, các ngôn ngữ lập trình thường lai tạp nhiều hình thái lập trình khác nhau để lập trình viên sử dụng các ngôn ngữ "mệnh lệnh nhất" cũng có thể tận dụng một số các khái niệm này.[22]
Hàm hạng nhất và hàm bậc cao[sửa | sửa mã nguồn]
Hàm bậc cao là các hàm số hoặc có thể nhận các hàm số khác làm tham số hoặc có thể trả về kết quả là hàm số (phép toán vi phân để tính vi phân của hàm là một ví dụ của hàm bậc cao trong giải tích).
Các hàm bậc cao có liên hệ chặt chẽ với hàm hạng nhất, ở chỗ các hàm bậc cao và hàm hạng nhất đều cho phép nhận hàm số làm tham số và trả về các hàm khác. Sự khác biệt giữa hai loại này rất mờ nhạt: "bậc cao" mô tả một khái niệm hàm trong toán học tính toán trong các hàm khác, còn "hàm hạng nhất" là một thuật ngữ của ngành khoa học máy tính mô tả các thực thể của ngôn ngữ lập trình trong đó không có giới hạn về việc sử dụng (vì vậy các hàm hạng nhất có thể xuất hiện ở bất cứ đâu trong chương trình, giống như các thực thể hạng nhất khác nhau con số, trong đó có cả việc làm tham số cho các hàm khác và làm giá trị trả về của hàm khác).
Các hàm bậc cao cho phép áp dụng bán phần hoặc currying, một kỹ thuật trong đó hàm lần lượt sử dụng từng tham số của nó, mỗi lần sử dụng lại trả về một hàm mới và chấp nhận tham số tiếp theo. Việc làm này cho phép người lập trình biểu diễn một cách súc tích hàm số kế thừa, tương tự như toán tử cộng sẽ lần lượt cộng từng số tự nhiên lại với nhau.
Hàm thuần túy[sửa | sửa mã nguồn]
Các hàm (hoặc biểu thức) thuần túy hàm không có bộ nhớ hoặc các hiệu ứng lề nhập/xuất. Điều này có nghĩa là các hàm thuần túy có một số đặc tính hữu ích, mà đa số trong chúng có thể dùng để tối ưu mã nguồn:
- Nếu kết quả của một biểu thức thuần túy không được sử dụng, ta có thể xóa nó đi mà không ảnh hưởng đến các biểu thức khác.
- Nếu một hàm thuần túy được gọi cùng với các tham số không tạo ra hiệu ứng lề, kết quả sẽ là hằng số tương ứng với danh sách tham số cụ thể (có khi gọi là trong suốt tham chiếu), tức là hàm thuần túy nếu được gọi lần nữa với cùng bộ tham số, kết quả trả về cũng sẽ y hệt như trước (điều này cho phép tối ưu hóa lưu đệm như memoization).
- Nếu không có sự phụ thuộc về dữ liệu giữa hai biểu thức thuần túy, thì thứ tự của chúng có thể đảo cho nhau, hoặc chúng có thể thực hiện song song mà không ảnh hưởng đến nhau (hay nói cách khác, đánh giá một biểu thức thuần túy bất kỳ là an toàn về luồng (thread-safe)).
- Nếu toàn bộ ngôn ngữ không cho phép hiệu ứng lề, thì chiến thuật đánh giá hàm nào cũng dùng được; việc này trao cho trình biên dịch quyền tự do sắp xếp lại hoặc phối hợp việc đánh giá biểu thức trong một chương trình (ví dụ, dùng kỹ thuật loại bỏ cây).
Trong khi đa số trình biên dịch dành cho các ngôn ngữ lập trình mệnh lệnh có thể nhận dạng hàm thuần túy, và thực hiện các phép khử biểu thức con thường gặp trong các lệnh gọi hàm thuẫn túy, chúng không thể lúc nào cũng làm như vậy đối với các thư viện đã dịch sẵn, thường không tiết lộ thông tin này, vì thế làm cản trở sự tối ưu hóa liên quan đến các hàm bên ngoài như vậy. Một số trình biên dịch, như gcc, thêm từ khóa bổ sung để giúp lập trình viên đánh dấu hàm nào là hàm thuần túy, để cho phép tối ưu hóa kiểu như vậy. Fortran 95 cho phép hàm được chỉ định "thuần túy".
Đệ quy[sửa | sửa mã nguồn]
Vòng lặp trong các ngôn ngữ hàm thường được thực hiện thông qua đệ quy. Hàm đệ quy sẽ tự gọi chính nó, cho phép thực hiện đi thực hiện lại một tác vụ. Việc đệ quy có thể đòi hỏi phải sử dụng một chồng (stack), nhưng đệ quy đuôi vẫn có thể được trình biên dịch nhận ra và tối ưu hóa nó thành cùng đoạn mã được dùng để hiện thực vòng lặp trong ngôn ngữ mệnh lệnh. Tiêu chuẩn của ngôn ngữ Scheme là phải nhận diện và tối ưu hóa được đệ quy đuôi. Một trong những cách tối ưu hóa đệ quy đuôi là chuyển chương trình thành kiểu truyền liên tiếp trong quá trình dịch.
Các mẫu đệ quy phổ biến đều có thể được khử đệ quy bằng các hàm bậc cao, catamorphism và anamorphism (hay "fold" và "unfold" - gấp và mở gấp) là những ví dụ rõ nhất. Các hàm bậc cao như vậy đóng vai trò tương tự như các cấu trúc điều khiển có sẵn như vòng lặp trong ngôn ngữ mệnh lệnh.
Đa số các ngôn ngữ lập trình hàm đa mục đích đều cho phép đệ quy không giới hạn và là Turing complete, khiến cho bài toán dừng trở nên không quyết định được, có thể gây ra sự thiếu căn cứ cho việc suy diễn công thức, và nói chung đòi hỏi phải có khái niệm không nhất quán trong logic do hệ thống kiểu của ngôn ngữ quy định. Một vài ngôn ngữ lập trình với mục đích đặc biệt như Coq chỉ cho phép đệ quy well-founded và chuẩn hóa mạnh (tính toán không dừng chỉ có thể biểu diễn bằng dòng giá trị vô hạn gọi là codata). Kết quả là, những ngôn ngữ như vậy không phải Turing complete và một số hàm không thể biểu diễn trong ngôn ngữ, dù ngôn ngữ đó vẫn có thể biểu diễn được rất nhiều cách tính toán thú vị mà tránh được vấn đề do đệ quy không giới hạn gây ra. Lập trình hàm giới hạn trong việc đệ quy well-founded với một số ràng buộc khác được gọi là lập trình hàm hoàn toàn (total). Xem Turner 2004 để biết thêm.[23]
Tính toán chặt và không chặt[sửa | sửa mã nguồn]
Có thể chia các ngôn ngữ hàm làm hai loại tùy vào việc chúng sử dụng cách tính toán biểu thức chặt (tham lam) hay không chặt (lười biếng), là những khái niệm chỉ cách xử lý thông số của hàm khi tính toán một biểu thức. Sự khác biệt về các cách tính toán này xuất hiện ở ngữ nghĩa biểu thị của biểu thức khi chúng có chứa phép toán lỗi hoặc có vấn đề. Khi tính toán chặt, việc tính toán số hạng có chứa lỗi cũng sẽ dẫn đến lỗi. Ví dụ, biểu thức:
- print length([2+1, 3*2, 1/0, 5-4])
sẽ không tính được theo tính toán chặt vì phép chia không tại phần tử thứ ba của danh sách. Còn với tính toán không chặt, hàm length sẽ trả về giá trị 4, vì khi tính toán hàm, nó không cố gắng tính toán các phần tử trong danh sách. Nói một cách ngắn gọn, tính toán chặt luôn luôn tính toán tất cả cấc số hạng của hàm trước khi xử lý hàm. Tính toán không chặt không tính toán tham số của hàm trừ khi nó cần giá trị đó để tính toán hàm.
Cách hiện thực thông thường của tính toán không chặt trong ngôn ngữ hàm là thu giảm đồ thị. Cách tính toán không chặt được dùng mặc định trong vài ngôn ngữ lập trình hàm thuần túy, như Miranda, Clean và Haskell.
Hughes vào năm 1984 đã phản bác việc dùng tính toán không chặt làm cơ chế để tăng tính module hóa của chương trình thông qua quá trình chia nhỏ bài toán, bằng cách làm cho việc hiện thực độc lập giữa nhà sản xuất và khách hàng dễ dàng hơn.[24] Launchbury 1993 mô tả một số khó khăn mà đánh giá lười biếng tạo ra, cụ thể trong việc phân tích yêu cầu lưu trữ của chương trình, và đề xuất ngữ nghĩa hoạt động để hỗ trợ cho việc phân tích này.[25] Harper 2009 đề xuất đưa cả tính toán chặt lẫn không chặt vào một ngôn ngữ, bằng cách dùng hệ thống kiểu của ngôn ngữ để phân biệt chúng.[26]
Hệ thống kiểu, tính đa hình, kiểu dữ liệu đại số và so trùng mẫu[sửa | sửa mã nguồn]
Đặc biệt kể từ sự phát triển của luận kiểu Hindley–Milner trong thập niên 1970, các ngôn ngữ lập trình hàm có khuynh hướng sử dụng phép tính lambda định kiểu, chống lại phép tính lambda bất định kiểu đã được dùng trong Lisp và các biến thể của nó (như Scheme). Việc sử dụng các kiểu dữ liệu đại số và so trùng mẫu làm cho việc thao tác các cấu trúc dữ liệu phức tạp trở nên thuận tiện và rõ ràng hơn; sự tồn tại của việc kiểm tra kiểu mạnh mẽ trong thời gian biên dịch làm cho các chương trình trở nên đáng tin cậy hơn, trong khi đó luận kiểu giải phóng lập trình viên khỏi việc cần phải khai báo thủ công các kiểu để biên dịch.
Một số ngôn ngữ lập trình hàm định hướng nghiên cứu như Coq, Agda, Cayenne, và Epigram dựa trên lý thuyết kiểu intuitionistic, thuyết này cho phép các kiểu phụ thuộc vào các term. Các kiểu như vậy được gọi là các kiểu phụ thuộc. Các hệ thống kiểu này không có các luận kiểu khả định và rất khó để hiểu và lập trình với chúng. Nhưng các kiểu phụ thuộc này có thể mô tả các mệnh đề tự do trong logic mệnh đề. Thông qua Curry–Howard isomorphism, sau đó, các chương trình định kiểu tốt trong những ngôn ngữ này sẽ trở thành các phương tiện cho việc viết các chứng minh toán học hình thức mà từ đó một trình biên dịch có thể sinh ra mã được chứng nhận. Trong khi những ngôn ngữ này chủ yếu được quan tâm trong nghiên cứu học thuật (kể cả trong toán học hình thức hóa), chúng cũng bắt đầu được sử dụng trong kĩ thuật. Compcert là một trình biên dịch cho một tập con của ngôn ngữ lập trình C được viết bằng Coq và đã được chứng thực chính thức.[27]
Một dạng giới hạn của các kiểu phụ thuộc được gọi là kiểu dữ liệu đại số được khái quát hóa (GADT). Dạng này có thể được thực hiện theo cách cung cấp một vài trong số các lợi ích của lập trình phụ thuộc kiểu trong khi tránh hầu hết sự bất tiện của nó.[28] GADT có sẵn trong Trình biên dịch Glasgow Haskell và trong Scala (như "case classes"), và được cho là phần bổ sung vào các ngôn ngữ khác bao gồm cả Java và C#.[29]
Lập trình hàm trong các ngôn ngữ phi hàm[sửa | sửa mã nguồn]
Có thể sử dụng phong cách hàm của việc lập trình trong các ngôn ngữ mà theo truyền thống không được xem là ngôn ngữ hàm.[30] Một số ngôn ngữ phi hàm đã mượn nhiều đặc điểm như các hàm bậc cao hơn, và các quan niệm danh sách từ các ngôn ngữ lập trình hàm. Điều này làm cho việc chấp nhận phong cách hàm dễ dàng hơn khi sử dụng những ngôn ngữ này. Các cấu trúc hàm như các "hàm bậc cao hơn" và các "danh sách lười" có thể lấy được trong C++ qua các thư viện.[31] Trong C, các con trỏ hàm có thể được dùng để đạt được một vài trong số các hiệu quả của các hàm bậc cao hơn. Ví dụ hàm chung map có thể được thực thi bằng cách dùng các con trỏ hàm. Trong Visual Basic 9 và C# 3.0 và cao hơn, các hàm lambda có thể được dùng để viết các chương trình theo phong cách hàm. [32] Trong Java, các lớp nặc danh đôi khi được sử dụng để mô phỏng các sự đóng,[cần dẫn nguồn] tuy nhiên các lớp nặc danh không phải luôn luôn là các thay thế chính xác cho các sự đóng bởi vì chúng có nhiều khả năng bị hạn chế hơn.
Nhiều mẫu thiết kế hướng đối tượng có thể biểu đạt bằng các thuật ngữ lập trình hàm: ví dụ, mẫu chiến lược đơn giản chỉ ra cách dùng của hàm bậc cao hơn, và mẫu khách viếng thăm gần như tương ứng với một catamorphism, hoặc fold.
Các ích lợi của dữ liệu bất biến có thể được thấy ngay cả trong các chương trình mệnh lệnh, vì thế các lập trình viên thường xuyên cố gắng làm cho một số dữ liệu bất biến ngay cả trong các chương trình mệnh lệnh.[33]
Xem thêm[sửa | sửa mã nguồn]
- Ngôn ngữ hàm, các bài viết Wikipedia về các ngôn ngữ cụ thể có tính năng lập trình hàm
- Lập trình mệnh lệnh
- Phép tính lambda
- Lập trình luận lý
- Hàm lồng nhau
- Lập trình thủ tục
Tham khảo[sửa | sửa mã nguồn]
- ^ a ă â Hudak, Paul (tháng 9 năm 1989). “Conception, evolution, and application of functional programming languages” (PDF). ACM Computing Surveys 21 (3): 359–411. doi:10.1145/72551.72554.
- ^ Clinger, Will (1987). “MultiTasking and MacScheme”. MacTech 3 (12). Truy cập ngày 28 tháng 8 năm 2008.
- ^ Hartheimer, Anne (1987). “Programming a Text Editor in MacScheme+Toolsmith”. MacTech 3 (1). Truy cập ngày 28 tháng 8 năm 2008.
- ^ Kidd, Eric. Terrorism Response Training in Scheme. CUFP 2007. Truy cập ngày 26 tháng 8 năm 2009.
- ^ Cleis, Richard. Scheme in Space. CUFP 2006. Truy cập ngày 26 tháng 8 năm 2009.
- ^ “Who uses Erlang for product development?”. Frequently asked questions about Erlang. Truy cập ngày 5 tháng 8 năm 2007.
- ^ Armstrong, Joe (tháng 6 năm 2007). A history of Erlang. Third ACM SIGPLAN Conference on History of Programming Languages. San Diego, California. Truy cập ngày 29 tháng 8 năm 2009.
- ^ Larson, Jim (tháng 3 năm 2009). “Erlang for concurrent programming”. Communications of the ACM 52 (3): 48. doi:10.1145/1467247.1467263. Truy cập ngày 29 tháng 8 năm 2009.
- ^ Minsky, Yaron; Weeks, Stephen (tháng 7 năm 2008). “Caml Trading - experiences with functional programming on Wall Street”. Journal of Functional Programming (Cambridge University Press) 18 (4): 553–564. doi:10.1017/S095679680800676X. Truy cập ngày 27 tháng 8 năm 2008.
- ^ Leroy, Xavier. Some uses of Caml in Industry (PDF). CUFP 2007. Truy cập ngày 26 tháng 8 năm 2009.
- ^ “"Haskell in industry - Haskell Wiki”. Truy cập ngày 26 tháng 8 năm 2009.
Haskell has a diverse range of use commercially, from aerospace and defense, to finance, to web startups, hardware design firms and lawnmower manufacturers.
- ^ Hudak, Paul (tháng 6 năm 2007). A history of Haskell: being lazy with class. Third ACM SIGPLAN Conference on History of Programming Languages. San Diego, California. Truy cập ngày 29 tháng 8 năm 2009. Đã bỏ qua tham số không rõ
|coauthores=(trợ giúp)
- ^ The useR! 2006 conference schedule includes papers on the commercial use of R
- ^ Chambers, John M. (1998). Programming with Data: A Guide to the S Language. Springer Verlag. tr. 67–70. ISBN 978-0387985039.
- ^ Department of Applied Math, University of Colorado. “Functional vs. Procedural Programming Language”. Truy cập ngày 28 tháng 8 năm 2006.
- ^ Dimitre Novatchev. “The Functional Programming Language XSLT - A proof through examples”. TopXML. Truy cập ngày 27 tháng 5 năm 2006.
- ^ David Mertz. “XML Programming Paradigms (part four): Functional Programming approached to XML processing”. IBM developerWorks. Truy cập ngày 27 tháng 5 năm 2006.
- ^ Donald D. Chamberlin và Raymond F. Boyce (1974). “SEQUEL: A structured English query language”. Proceedings of the 1974 ACM SIGFIDET: 249–264.. In this paper, one of the first formal presentations of the concepts of SQL (and before the name was later abbreviated), Chamberlin and Boyce emphasize that SQL was developed "Without resorting to the concepts of bound variables and quantifiers".
- ^ Simon Peyton Jones, Margaret Burnett, Alan Blackwell (tháng 3 năm 2003). “Improving the world's most popular functional language: user-defined functions in Excel”.
- ^ Dominus, Mark J. (2005). Higher-Order Perl. Morgan Kaufmann. ISBN 1558607013.
- ^ Crockford, Douglas (2001). “JavaScript: The World's Most Misunderstood Programming Language”. "JavaScript's C-like syntax, including curly braces and the clunky for statement, makes it appear to be an ordinary procedural language. This is misleading because JavaScript has more in common with functional languages like Lisp or Scheme than with C or Java. It has arrays instead of lists and objects instead of property lists. Functions are first class. It has closures. You get lambdas without having to balance all those parens." (For discussion on JavaScript as a functional programming language, see Talk:JavaScript#Function-level vs. functional programming).
- ^ Dick Pountain. “Functional Programming Comes of Age”. BYTE.com (August 1994). Truy cập ngày 31 tháng 8 năm 2006.
- ^ Turner, D.A. (ngày 28 tháng 7 năm 2004). “Total Functional Programming”. Journal of Universal Computer Science 10 (7): 751–768. doi:10.3217/jucs-010-07-0751.
- ^ John Hughes. “Why Functional Programming Matters”.
- ^ John Launchbury (1993). “A Natural Semantics for Lazy Evaluation”.
- ^ Robert W. Harper (2009). Practical Foundations for Programming Languages (PDF). (in preparation), section XIV.
- ^ “The Compcert verified compiler”.
- ^ Simon Peyton Jones, Dimitrios Vytiniotis, Stephanie Weirich, and Geoffrey Washburn. “Simple unification-based type inference for GADTs”. ICFP 2006. tr. 50–61.
- ^ Andrew Kennedy and Claudio Russo (tháng 10 năm 2005). “Generalized Algebraic Data Types and Object-Oriented Programming” (PDF). OOPSLA. San Diego, California. source of citation
- ^ Hartel, Pieter; Henk Muller and Hugh Glaser (tháng 3 năm 2004). “The Functional C experience” (PDF). The Journal of Functional Programming 14 (2): 129–135. doi:10.1017/S0956796803004817. ; David Mertz. “Functional programming in Python, Part 3”. IBM developerWorks. Truy cập ngày 17 tháng 9 năm 2006.(Part 1, Part 2)
- ^ McNamara, B. “FC++: Functional Programming in C++”. Truy cập ngày 28 tháng 5 năm 2006.
- ^ Miller, Jeremy (2009). “Functional Programming for Everyday.NET Development”. The Language Integrated Query (LINQ) feature in all of its many incarnations is an obvious and powerful use of functional programming in.NET, but that's just the tip of the iceberg.
- ^ See Item 15 in the book Effective Java, Second Edition by Joshua Bloch
Đọc thêm[sửa | sửa mã nguồn]
- Abelson, Hal; Sussman, Gerald Jay (1985). [[Structure and Interpretation of Computer Programs]]. MIT Press. Tựa đề URL chứa liên kết wiki (trợ giúp)
- Cousineau, Guy and Michel Mauny. The Functional Approach to Programming. Cambridge, UK: Cambridge University Press, 1998.
- Curry, Haskell Brooks and Feys, Robert and Craig, William. Combinatory Logic. Volume I. North-Holland Publishing Company, Amsterdam, 1958.
- Curry, Haskell B.; Hindley, J. Roger; Seldin, Jonathan P. (1972). Combinatory Logic. Vol. II. Amsterdam: North Holland. ISBN 0-7204-2208-6.
- Dominus, Mark Jason. Higher-Order Perl. Morgan Kaufmann. 2005.
- Felleisen, Matthias; Findler, Robert; Flatt, Matthew; Krishnamurthi, Shriram (2001). [[How to Design Programs]]. MIT Press. Tựa đề URL chứa liên kết wiki (trợ giúp)
- Graham, Paul. ANSI Common LISP. Englewood Cliffs, New Jersey: Prentice Hall, 1996.
- MacLennan, Bruce J. Functional Programming: Practice and Theory. Addison-Wesley, 1990.
- O'Sullivan, Brian; Stewart, John; Goerzen, Don (2008). Real World Haskell. O'Reilly.
- Pratt, Terrence, W. and Marvin V. Zelkowitz. Programming Languages: Design and Implementation. 3rd ed. Englewood Cliffs, New Jersey: Prentice Hall, 1996.
- Salus, Peter H. Functional and Logic Programming Languages. Vol. 4 of Handbook of Programming Languages. Indianapolis, Indiana: Macmillan Technical Publishing, 1998.
- Thompson, Simon. Haskell: The Craft of Functional Programming. Harlow, England: Addison-Wesley Longman Limited, 1996.
Liên kết ngoài[sửa | sửa mã nguồn]
- Functional Programming for the Rest of Us An introduction by Slava Akhmechet
- Functional programming in Python (by David Mertz): part 1, part 2, part 3
- The Implementation of Functional Programming Languages Simon Peyton Jones, published by Prentice Hall, 1987.

markdown:
# Lập trình hàm
Trong ngành
[khoa học máy tính](/wiki/Khoa_h%E1%BB%8Dc_m%C3%A1y_t%C3%ADnh), **lập trình hàm** là một [mô hình lập trình](/wiki/M%E1%BA%ABu_h%C3%ACnh_l%E1%BA%ADp_tr%C3%ACnh) xem việc tính toán là sự đánh giá các [hàm toán học](/w/index.php?title=H%C3%A0m_(to%C3%A1n_h%E1%BB%8Dc)&action=edit&redlink=1) và tránh sử dụng [trạng thái](/w/index.php?title=Tr%E1%BA%A1ng_th%C3%A1i_ch%C6%B0%C6%A1ng_tr%C3%ACnh&action=edit&redlink=1) và các dữ liệu biến đổi. Lập trình hàm nhấn mạnh việc ứng dụng hàm số, trái với phong cách [lập trình mệnh lệnh](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_m%E1%BB%87nh_l%E1%BB%87nh&action=edit&redlink=1), nhấn mạnh vào sự thay đổi trạng thái. Lập trình hàm xuất phát từ [1] [phép tính lambda](/wiki/Ph%C3%A9p_t%C3%ADnh_lambda), một [hệ thống hình thức](/w/index.php?title=H%E1%BB%87_th%E1%BB%91ng_h%C3%ACnh_th%E1%BB%A9c&action=edit&redlink=1)được phát triển vào những năm 1930 để nghiên cứu định nghĩa hàm số, ứng dụng của hàm số, và [đệ quy](/wiki/%C4%90%E1%BB%87_quy). Nhiều [ngôn ngữ lập trình](/wiki/Ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)hàm có thể được xem là những cách phát triển giải tích lambda. [[1]](#cite_note-hudak1989-1)
Trong thực tế, sự khác biệt giữa hàm số toán học và cách dùng từ "hàm" trong lập trình mệnh lệnh đó là các hàm mệnh lệnh có thể tạo ra
[hiệu ứng lề](/w/index.php?title=Hi%E1%BB%87u_%E1%BB%A9ng_l%E1%BB%81_(khoa_h%E1%BB%8Dc_m%C3%A1y_t%C3%ADnh)&action=edit&redlink=1), làm thay đổi giá trị của một phép tính trước đó. Vì vậy các hàm kiểu này thiếu tính [trong suốt tham chiếu](/w/index.php?title=Trong_su%E1%BB%91t_tham_chi%E1%BA%BFu&action=edit&redlink=1), có nghĩa là cùng một biểu thức ngôn ngữ lại có thể tạo ra nhiều giá trị khác nhau vào các thời điểm khác nhau tùy thuộc vào trạng thái của chương trình đang thực thi. Ngược lại, trong lập trình hàm, giá trị xuất ra của một hàm chỉ phụ thuộc vào các tham số đầu vào của hàm, vì thế gọi hàm *f* hai lần với cùng giá trị tham số *x* sẽ cho ra cùng kết quả *f(x)*. Việc loại bỏ hiệu ứng lề có thể làm cho chương trình dễ hiểu hơn rất nhiều và người ta có dự đoán được hành vi của một chương trình, đó chính là một trong các động lực chính cho sự phát triển của lập trình hàm. [[1]](#cite_note-hudak1989-1)
Các ngôn ngữ lập trình hàm, đặc biệt là các loại thuần lập trình hàm, có ảnh hưởng lớn trong giới
[học thuật](/w/index.php?title=H%E1%BB%8Dc_thu%E1%BA%ADt&action=edit&redlink=1) hơn là dùng để phát triển các phần mềm thương mại. Tuy vậy, các ngôn ngữ lập trình hàm nổi bật như [Scheme](/wiki/Scheme), [[2]](#cite_note-clinger1987-2) [[3]](#cite_note-hartheimer1987-3) [[4]](#cite_note-kidd2007-4) [[5]](#cite_note-cleis2006-5) [Erlang](/w/index.php?title=Erlang&action=edit&redlink=1), [[6]](#cite_note-erlang-faq-6) [[7]](#cite_note-armstrong2007-7) [[8]](#cite_note-larson2009-8) [Objective Caml](/w/index.php?title=Objective_Caml&action=edit&redlink=1), [[9]](#cite_note-minksy2008-9) và [10] [Haskell](/wiki/Haskell) [[11]](#cite_note-haskell-industry-11) đã được nhiều tổ chức khác nhau sử dụng trong các ứng dụng công nghiệp và thương mại. Lập trình hàm cũng được sử dụng trong công nghiệp thông qua các [[12]](#cite_note-hudak2007-12) [ngôn ngữ lập trình chuyên biệt](/w/index.php?title=Ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh_chuy%C3%AAn_bi%E1%BB%87t&action=edit&redlink=1)như [R](/wiki/R_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh))(thống kê), [[13]](#cite_note-useR-13) [[14]](#cite_note-Chambers-14) [Mathematica](/wiki/Mathematica)(toán học hình thức), [[15]](#cite_note-Amath-CO-15) [J](/w/index.php?title=J_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)&action=edit&redlink=1)và [K](/w/index.php?title=K_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)&action=edit&redlink=1)(phân tích tài chính) , [F#](/w/index.php?title=F_Sharp_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)&action=edit&redlink=1)trong Microsoft.NET và [XSLT](/wiki/XSLT)( [XML](/wiki/XML)). [[16]](#cite_note-Novatchev-16) Các ngôn ngữ chuyên biệt dạng khai báo được sử dụng rộng rãi hiện nay như [[17]](#cite_note-Mertz-17) [SQL](/wiki/SQL)và [Lex](/w/index.php?title=Lex&action=edit&redlink=1)/ [Yacc](/wiki/Yacc), cũng sử dụng một số thành phần của lập trình hàm, đặc biệt để tránh các giá trị biến đổi. Các [[18]](#cite_note-Chamberlin_Boyce-18) [bảng tính](/wiki/B%E1%BA%A3ng_t%C3%ADnh)(spreadsheet) cũng có thể được xem là các ngôn ngữ lập trình hàm. [[19]](#cite_note-excel-19)
Lập trình theo phong cách lập trình hàm cũng có thể thực hiện ở các ngôn ngữ không được thiết kế riêng cho lập trình hàm. Ví dụ, ngôn ngữ lập trình mệnh lệnh
[Perl](/w/index.php?title=Perl_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)&action=edit&redlink=1) đã có một cuốn sách viết về cách áp dụng các khái niệm lập trình hàm vào đó. [[20]](#cite_note-20) [JavaScript](/wiki/JavaScript), một trong các ngôn ngữ được dùng nhiều hiện nay, có khả năng lập trình hàm. [[21]](#cite_note-crockford-javascript-21)
## Mục lục
## Các khái niệm[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C3%A0m&veaction=edit§ion=1) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C3%A0m&action=edit§ion=1)]
Một số khái niệm và mô hình chỉ có ở lập trình hàm, và thường xa lạ với kiểu
[lập trình mệnh lệnh](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_m%E1%BB%87nh_l%E1%BB%87nh&action=edit&redlink=1) (bao gồm cả [lập trình hướng đối tượng](/wiki/L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng)). Tuy nhiên, các ngôn ngữ lập trình thường lai tạp nhiều hình thái lập trình khác nhau để lập trình viên sử dụng các ngôn ngữ "mệnh lệnh nhất" cũng có thể tận dụng một số các khái niệm này. [[22]](#cite_note-22)
### Hàm hạng nhất và hàm bậc cao[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C3%A0m&veaction=edit§ion=2) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C3%A0m&action=edit§ion=2)] [Hàm bậc cao](/w/index.php?title=H%C3%A0m_b%E1%BA%ADc_cao&action=edit&redlink=1) là các hàm số hoặc có thể nhận các hàm số khác làm tham số hoặc có thể trả về kết quả là hàm số ( [phép toán vi phân](/w/index.php?title=Ph%C3%A9p_to%C3%A1n_vi_ph%C3%A2n&action=edit&redlink=1) để tính [vi phân](/w/index.php?title=%C4%90%E1%BA%A1o_h%C3%A0m_v%C3%A0_vi_ph%C3%A2n_c%E1%BB%A7a_h%C3%A0m_s%E1%BB%91&action=edit&redlink=1) của hàm là một ví dụ của hàm bậc cao trong giải tích).
Các hàm bậc cao có liên hệ chặt chẽ với
[hàm hạng nhất](/w/index.php?title=H%C3%A0m_h%E1%BA%A1ng_nh%E1%BA%A5t&action=edit&redlink=1), ở chỗ các hàm bậc cao và hàm hạng nhất đều cho phép nhận hàm số làm tham số và trả về các hàm khác. Sự khác biệt giữa hai loại này rất mờ nhạt: "bậc cao" mô tả một khái niệm hàm trong toán học tính toán trong các hàm khác, còn "hàm hạng nhất" là một thuật ngữ của ngành khoa học máy tính mô tả các thực thể của ngôn ngữ lập trình trong đó không có giới hạn về việc sử dụng (vì vậy các hàm hạng nhất có thể xuất hiện ở bất cứ đâu trong chương trình, giống như các thực thể hạng nhất khác nhau con số, trong đó có cả việc làm tham số cho các hàm khác và làm giá trị trả về của hàm khác).
Các hàm bậc cao cho phép
[áp dụng bán phần](/w/index.php?title=%C3%81p_d%E1%BB%A5ng_b%C3%A1n_ph%E1%BA%A7n&action=edit&redlink=1) hoặc [currying](/w/index.php?title=Currying&action=edit&redlink=1), một kỹ thuật trong đó hàm lần lượt sử dụng từng tham số của nó, mỗi lần sử dụng lại trả về một hàm mới và chấp nhận tham số tiếp theo. Việc làm này cho phép người lập trình biểu diễn một cách súc tích hàm số kế thừa, tương tự như toán tử cộng sẽ lần lượt cộng từng số tự nhiên lại với nhau.
### Hàm thuần túy[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C3%A0m&veaction=edit§ion=3) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C3%A0m&action=edit§ion=3)]
Các hàm (hoặc biểu thức)
[thuần túy hàm](/w/index.php?title=Thu%E1%BA%A7n_t%C3%BAy_h%C3%A0m&action=edit&redlink=1) không có bộ nhớ hoặc các [hiệu ứng lề](/w/index.php?title=Hi%E1%BB%87u_%E1%BB%A9ng_l%E1%BB%81_(khoa_h%E1%BB%8Dc_m%C3%A1y_t%C3%ADnh)&action=edit&redlink=1) nhập/xuất. Điều này có nghĩa là các hàm thuần túy có một số đặc tính hữu ích, mà đa số trong chúng có thể dùng để tối ưu mã nguồn:
- Nếu kết quả của một biểu thức thuần túy không được sử dụng, ta có thể xóa nó đi mà không ảnh hưởng đến các biểu thức khác.
- Nếu một hàm thuần túy được gọi cùng với các tham số không tạo ra hiệu ứng lề, kết quả sẽ là hằng số tương ứng với danh sách tham số cụ thể (có khi gọi là
[trong suốt tham chiếu](/w/index.php?title=Trong_su%E1%BB%91t_tham_chi%E1%BA%BFu_(khoa_h%E1%BB%8Dc_m%C3%A1y_t%C3%ADnh)&action=edit&redlink=1)), tức là hàm thuần túy nếu được gọi lần nữa với cùng bộ tham số, kết quả trả về cũng sẽ y hệt như trước (điều này cho phép tối ưu hóa lưu đệm như [memoization](/w/index.php?title=Memoization&action=edit&redlink=1)).
- Nếu không có sự phụ thuộc về dữ liệu giữa hai biểu thức thuần túy, thì thứ tự của chúng có thể đảo cho nhau, hoặc chúng có thể thực hiện
[song song](/w/index.php?title=Song_song_h%C3%B3a&action=edit&redlink=1)mà không ảnh hưởng đến nhau (hay nói cách khác, đánh giá một biểu thức thuần túy bất kỳ là [an toàn về luồng](/w/index.php?title=An_to%C3%A0n_v%E1%BB%81_lu%E1%BB%93ng&action=edit&redlink=1)(thread-safe)).
- Nếu toàn bộ ngôn ngữ không cho phép hiệu ứng lề, thì chiến thuật đánh giá hàm nào cũng dùng được; việc này trao cho trình biên dịch quyền tự do sắp xếp lại hoặc phối hợp việc đánh giá biểu thức trong một chương trình (ví dụ, dùng kỹ thuật
[loại bỏ cây](/w/index.php?title=Lo%E1%BA%A1i_b%E1%BB%8F_c%C3%A2y&action=edit&redlink=1)).
Trong khi đa số trình biên dịch dành cho các ngôn ngữ lập trình mệnh lệnh có thể nhận dạng hàm thuần túy, và thực hiện các phép khử biểu thức con thường gặp trong các lệnh gọi hàm thuẫn túy, chúng không thể lúc nào cũng làm như vậy đối với các thư viện đã dịch sẵn, thường không tiết lộ thông tin này, vì thế làm cản trở sự tối ưu hóa liên quan đến các hàm bên ngoài như vậy. Một số trình biên dịch, như
[gcc](/w/index.php?title=GNU_Compiler_Collection&action=edit&redlink=1), thêm từ khóa bổ sung để giúp lập trình viên đánh dấu hàm nào là hàm thuần túy, để cho phép tối ưu hóa kiểu như vậy. [Fortran 95](/w/index.php?title=Fortran_95&action=edit&redlink=1) cho phép hàm được chỉ định "thuần túy".
### Đệ quy[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C3%A0m&veaction=edit§ion=4) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C3%A0m&action=edit§ion=4)] [Vòng lặp](/w/index.php?title=V%C3%B2ng_l%E1%BA%B7p&action=edit&redlink=1) trong các ngôn ngữ hàm thường được thực hiện thông qua [đệ quy](/wiki/%C4%90%E1%BB%87_quy). [Hàm đệ quy](/w/index.php?title=%C4%90%E1%BB%87_quy_(khoa_h%E1%BB%8Dc_m%C3%A1y_t%C3%ADnh)&action=edit&redlink=1) sẽ tự gọi chính nó, cho phép thực hiện đi thực hiện lại một tác vụ. Việc đệ quy có thể đòi hỏi phải sử dụng một chồng (stack), nhưng [đệ quy đuôi](/w/index.php?title=%C4%90%E1%BB%87_quy_%C4%91u%C3%B4i&action=edit&redlink=1) vẫn có thể được trình biên dịch nhận ra và tối ưu hóa nó thành cùng đoạn mã được dùng để hiện thực vòng lặp trong ngôn ngữ mệnh lệnh. Tiêu chuẩn của ngôn ngữ [Scheme](/wiki/Scheme) là phải nhận diện và tối ưu hóa được đệ quy đuôi. Một trong những cách tối ưu hóa đệ quy đuôi là chuyển chương trình thành kiểu truyền liên tiếp trong quá trình dịch.
Các mẫu đệ quy phổ biến đều có thể được khử đệ quy bằng các hàm bậc cao,
[catamorphism](/w/index.php?title=Catamorphism&action=edit&redlink=1) và [anamorphism](/w/index.php?title=Anamorphism&action=edit&redlink=1) (hay "fold" và "unfold" - gấp và mở gấp) là những ví dụ rõ nhất. Các hàm bậc cao như vậy đóng vai trò tương tự như các cấu trúc điều khiển có sẵn như [vòng lặp](/w/index.php?title=Lu%E1%BB%93ng_%C4%91i%E1%BB%81u_khi%E1%BB%83n&action=edit&redlink=1) trong [ngôn ngữ mệnh lệnh](/w/index.php?title=Ng%C3%B4n_ng%E1%BB%AF_m%E1%BB%87nh_l%E1%BB%87nh&action=edit&redlink=1).
Đa số các ngôn ngữ lập trình hàm đa mục đích đều cho phép đệ quy không giới hạn và là
[Turing complete](/w/index.php?title=Turing_complete&action=edit&redlink=1), khiến cho [bài toán dừng](/wiki/B%C3%A0i_to%C3%A1n_d%E1%BB%ABng) trở nên không quyết định được, có thể gây ra sự thiếu căn cứ cho việc [suy diễn công thức](/w/index.php?title=Suy_di%E1%BB%85n_c%C3%B4ng_th%E1%BB%A9c&action=edit&redlink=1), và nói chung đòi hỏi phải có khái niệm [không nhất quán](/w/index.php?title=Kh%C3%B4ng_nh%E1%BA%A5t_qu%C3%A1n&action=edit&redlink=1) trong logic do [hệ thống kiểu](/w/index.php?title=H%E1%BB%87_th%E1%BB%91ng_ki%E1%BB%83u&action=edit&redlink=1) của ngôn ngữ quy định. Một vài ngôn ngữ lập trình với mục đích đặc biệt như [Coq](/w/index.php?title=Coq&action=edit&redlink=1) chỉ cho phép đệ quy [well-founded](/w/index.php?title=Well-founded&action=edit&redlink=1) và [chuẩn hóa mạnh](/w/index.php?title=Chu%E1%BA%A9n_h%C3%B3a_m%E1%BA%A1nh&action=edit&redlink=1) (tính toán không dừng chỉ có thể biểu diễn bằng dòng giá trị vô hạn gọi là [codata](/w/index.php?title=Codata&action=edit&redlink=1)). Kết quả là, những ngôn ngữ như vậy không phải Turing complete và một số hàm không thể biểu diễn trong ngôn ngữ, dù ngôn ngữ đó vẫn có thể biểu diễn được rất nhiều cách tính toán thú vị mà tránh được vấn đề do đệ quy không giới hạn gây ra. Lập trình hàm giới hạn trong việc đệ quy well-founded với một số ràng buộc khác được gọi là [lập trình hàm hoàn toàn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C3%A0m_ho%C3%A0n_to%C3%A0n&action=edit&redlink=1) (total). Xem Turner 2004 để biết thêm. [[23]](#cite_note-totalfp-23)
### Tính toán chặt và không chặt[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C3%A0m&veaction=edit§ion=5) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C3%A0m&action=edit§ion=5)]
Có thể chia các ngôn ngữ hàm làm hai loại tùy vào việc chúng sử dụng cách tính toán biểu thức
*chặt (tham lam)* hay *không chặt (lười biếng)*, là những khái niệm chỉ cách xử lý thông số của hàm khi tính toán một biểu thức. Sự khác biệt về các cách tính toán này xuất hiện ở [ngữ nghĩa biểu thị](/w/index.php?title=Ng%E1%BB%AF_ngh%C4%A9a_bi%E1%BB%83u_th%E1%BB%8B&action=edit&redlink=1) của biểu thức khi chúng có chứa phép toán lỗi hoặc có vấn đề. Khi tính toán chặt, việc tính toán số hạng có chứa lỗi cũng sẽ dẫn đến lỗi. Ví dụ, biểu thức:
- print length([2+1, 3*2, 1/0, 5-4])
sẽ không tính được theo tính toán chặt vì phép chia không tại phần tử thứ ba của danh sách. Còn với tính toán không chặt, hàm length sẽ trả về giá trị 4, vì khi tính toán hàm, nó không cố gắng tính toán các phần tử trong danh sách. Nói một cách ngắn gọn, tính toán chặt luôn luôn tính toán tất cả cấc số hạng của hàm trước khi xử lý hàm. Tính toán không chặt không tính toán tham số của hàm trừ khi nó cần giá trị đó để tính toán hàm.
Cách hiện thực thông thường của tính toán không chặt trong ngôn ngữ hàm là
[thu giảm đồ thị](/w/index.php?title=Thu_gi%E1%BA%A3m_%C4%91%E1%BB%93_th%E1%BB%8B&action=edit&redlink=1). Cách tính toán không chặt được dùng mặc định trong vài ngôn ngữ lập trình hàm thuần túy, như [Miranda](/wiki/Miranda), [Clean](/w/index.php?title=Clean_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)&action=edit&redlink=1) và [Haskell](/wiki/Haskell_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)).
Hughes vào năm 1984 đã phản bác việc dùng tính toán không chặt làm cơ chế để tăng tính module hóa của chương trình thông qua quá trình chia nhỏ bài toán, bằng cách làm cho việc hiện thực độc lập giữa nhà sản xuất và khách hàng dễ dàng hơn.
Launchbury 1993 mô tả một số khó khăn mà đánh giá lười biếng tạo ra, cụ thể trong việc phân tích yêu cầu lưu trữ của chương trình, và đề xuất [24] [ngữ nghĩa hoạt động](/w/index.php?title=Ng%E1%BB%AF_ngh%C4%A9a_ho%E1%BA%A1t_%C4%91%E1%BB%99ng&action=edit&redlink=1)để hỗ trợ cho việc phân tích này. Harper 2009 đề xuất đưa cả tính toán chặt lẫn không chặt vào một ngôn ngữ, bằng cách dùng hệ thống kiểu của ngôn ngữ để phân biệt chúng. [[25]](#cite_note-25) [[26]](#cite_note-26)
### Hệ thống kiểu, tính đa hình, kiểu dữ liệu đại số và so trùng mẫu[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C3%A0m&veaction=edit§ion=6) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C3%A0m&action=edit§ion=6)]
Đặc biệt kể từ sự phát triển của
[luận kiểu Hindley–Milner](/w/index.php?title=Lu%E1%BA%ADn_ki%E1%BB%83u_Hindley%E2%80%93Milner&action=edit&redlink=1) trong thập niên 1970, các ngôn ngữ lập trình hàm có khuynh hướng sử dụng [phép tính lambda định kiểu](/w/index.php?title=Ph%C3%A9p_t%C3%ADnh_lambda_%C4%91%E1%BB%8Bnh_ki%E1%BB%83u&action=edit&redlink=1), chống lại [phép tính lambda bất định kiểu](/w/index.php?title=Ph%C3%A9p_t%C3%ADnh_lambda_b%E1%BA%A5t_%C4%91%E1%BB%8Bnh_ki%E1%BB%83u&action=edit&redlink=1) đã được dùng trong [Lisp](/wiki/Lisp) và các biến thể của nó (như [Scheme](/wiki/Scheme)). Việc sử dụng các [kiểu dữ liệu đại số](/w/index.php?title=Ki%E1%BB%83u_d%E1%BB%AF_li%E1%BB%87u_%C4%91%E1%BA%A1i_s%E1%BB%91&action=edit&redlink=1) và [so trùng mẫu](/w/index.php?title=So_tr%C3%B9ng_m%E1%BA%ABu&action=edit&redlink=1) làm cho việc thao tác các cấu trúc dữ liệu phức tạp trở nên thuận tiện và rõ ràng hơn; sự tồn tại của việc kiểm tra kiểu mạnh mẽ trong thời gian biên dịch làm cho các chương trình trở nên đáng tin cậy hơn, trong khi đó [luận kiểu](/w/index.php?title=Lu%E1%BA%ADn_ki%E1%BB%83u&action=edit&redlink=1) giải phóng lập trình viên khỏi việc cần phải khai báo thủ công các kiểu để biên dịch.
Một số ngôn ngữ lập trình hàm định hướng nghiên cứu như
[Coq](/w/index.php?title=Coq&action=edit&redlink=1), [Agda](/w/index.php?title=Agda_(ph%C6%B0%C6%A1ng_ti%E1%BB%87n_ch%E1%BB%A9ng_minh_%C4%91%E1%BB%8Bnh_l%C3%BD)&action=edit&redlink=1), [Cayenne](/w/index.php?title=Cayenne_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)&action=edit&redlink=1), và [Epigram](/w/index.php?title=Epigram_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)&action=edit&redlink=1) dựa trên [lý thuyết kiểu intuitionistic](/w/index.php?title=L%C3%BD_thuy%E1%BA%BFt_ki%E1%BB%83u_intuitionistic&action=edit&redlink=1), thuyết này cho phép các kiểu phụ thuộc vào các term. Các kiểu như vậy được gọi là các [kiểu phụ thuộc](/w/index.php?title=Ki%E1%BB%83u_ph%E1%BB%A5_thu%E1%BB%99c&action=edit&redlink=1). Các hệ thống kiểu này không có các luận kiểu khả định và rất khó để hiểu và lập trình với chúng. Nhưng các kiểu phụ thuộc này có thể mô tả các mệnh đề tự do trong [logic mệnh đề](/w/index.php?title=Logic_m%E1%BB%87nh_%C4%91%E1%BB%81&action=edit&redlink=1). Thông qua [Curry–Howard isomorphism](/w/index.php?title=Curry%E2%80%93Howard_isomorphism&action=edit&redlink=1), sau đó, các chương trình định kiểu tốt trong những ngôn ngữ này sẽ trở thành các phương tiện cho việc viết các [chứng minh toán học](/wiki/Ch%E1%BB%A9ng_minh_to%C3%A1n_h%E1%BB%8Dc) hình thức mà từ đó một trình biên dịch có thể sinh ra [mã được chứng nhận](/w/index.php?title=Ki%E1%BB%83m_so%C3%A1t_h%C3%ACnh_th%E1%BB%A9c&action=edit&redlink=1). Trong khi những ngôn ngữ này chủ yếu được quan tâm trong nghiên cứu học thuật (kể cả trong [toán học hình thức hóa](/w/index.php?title=To%C3%A1n_h%E1%BB%8Dc_h%C3%ACnh_th%E1%BB%A9c_h%C3%B3a&action=edit&redlink=1)), chúng cũng bắt đầu được sử dụng trong kĩ thuật. [Compcert](/w/index.php?title=Compcert&action=edit&redlink=1) là một [trình biên dịch](/wiki/Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch) cho một tập con của ngôn ngữ lập trình [C](/wiki/C_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)) được viết bằng Coq và đã được chứng thực chính thức. [[27]](#cite_note-27)
Một dạng giới hạn của các kiểu phụ thuộc được gọi là
[kiểu dữ liệu đại số được khái quát hóa](/w/index.php?title=Ki%E1%BB%83u_d%E1%BB%AF_li%E1%BB%87u_%C4%91%E1%BA%A1i_s%E1%BB%91_%C4%91%C6%B0%E1%BB%A3c_kh%C3%A1i_qu%C3%A1t_h%C3%B3a&action=edit&redlink=1) (GADT). Dạng này có thể được thực hiện theo cách cung cấp một vài trong số các lợi ích của lập trình phụ thuộc kiểu trong khi tránh hầu hết sự bất tiện của nó. GADT có sẵn trong [28] [Trình biên dịch Glasgow Haskell](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch_Glasgow_Haskell&action=edit&redlink=1)và trong [Scala](/w/index.php?title=Scala_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)&action=edit&redlink=1)(như "case classes"), và được cho là phần bổ sung vào các ngôn ngữ khác bao gồm cả [Java](/wiki/Java)và [C#](/wiki/C). [[29]](#cite_note-29)
### Lập trình hàm trong các ngôn ngữ phi hàm[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C3%A0m&veaction=edit§ion=7) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C3%A0m&action=edit§ion=7)]
Có thể sử dụng phong cách hàm của việc lập trình trong các ngôn ngữ mà theo truyền thống không được xem là ngôn ngữ hàm.
Một số ngôn ngữ phi hàm đã mượn nhiều đặc điểm như các [30] [hàm bậc cao hơn](/w/index.php?title=H%C3%A0m_b%E1%BA%ADc_cao_h%C6%A1n&action=edit&redlink=1), và các [quan niệm danh sách](/w/index.php?title=Quan_ni%E1%BB%87m_danh_s%C3%A1ch&action=edit&redlink=1)từ các ngôn ngữ lập trình hàm. Điều này làm cho việc chấp nhận phong cách hàm dễ dàng hơn khi sử dụng những ngôn ngữ này. Các cấu trúc hàm như các "hàm bậc cao hơn" và các "danh sách lười" có thể lấy được trong C++ qua các thư viện. Trong C, các con trỏ hàm có thể được dùng để đạt được một vài trong số các hiệu quả của các hàm bậc cao hơn. Ví dụ hàm chung [[31]](#cite_note-31) [map](/w/index.php?title=Map_(h%C3%A0m_b%E1%BA%ADc_cao_h%C6%A1n)&action=edit&redlink=1)có thể được thực thi bằng cách dùng các con trỏ hàm. Trong [Visual Basic 9](/wiki/Visual_Basic_2005)và [C# 3.0](/w/index.php?title=C_Sharp_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)&action=edit&redlink=1)và cao hơn, các hàm lambda có thể được dùng để viết các chương trình theo phong cách hàm. Trong [[32]](#cite_note-32) [Java](/wiki/Java_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)), các [lớp nặc danh](/w/index.php?title=L%E1%BB%9Bp_n%E1%BA%B7c_danh&action=edit&redlink=1)đôi khi được sử dụng để mô phỏng các sự đóng, tuy nhiên các lớp nặc danh không phải luôn luôn là các thay thế chính xác cho các sự đóng bởi vì chúng có nhiều khả năng bị hạn chế hơn.
Nhiều
[mẫu thiết kế](/wiki/M%E1%BA%ABu_thi%E1%BA%BFt_k%E1%BA%BF) [hướng đối tượng](/wiki/L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng) có thể biểu đạt bằng các thuật ngữ lập trình hàm: ví dụ, [mẫu chiến lược](/w/index.php?title=M%E1%BA%ABu_chi%E1%BA%BFn_l%C6%B0%E1%BB%A3c&action=edit&redlink=1) đơn giản chỉ ra cách dùng của *hàm bậc cao hơn*, và mẫu [khách viếng thăm](/w/index.php?title=Kh%C3%A1ch_vi%E1%BA%BFng_th%C4%83m_(m%E1%BA%ABu_thi%E1%BA%BFt_k%E1%BA%BF)&action=edit&redlink=1) gần như tương ứng với một [catamorphism](/w/index.php?title=Catamorphism&action=edit&redlink=1), hoặc [fold](/w/index.php?title=Fold_(h%C3%A0m_b%E1%BA%ADc_cao_h%C6%A1n)&action=edit&redlink=1).
Các ích lợi của dữ liệu bất biến có thể được thấy ngay cả trong các chương trình mệnh lệnh, vì thế các lập trình viên thường xuyên cố gắng làm cho một số dữ liệu bất biến ngay cả trong các chương trình mệnh lệnh.
[[33]](#cite_note-33)
## Xem thêm[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C3%A0m&veaction=edit§ion=8) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C3%A0m&action=edit§ion=8)] [Ngôn ngữ hàm](/w/index.php?title=Th%E1%BB%83_lo%E1%BA%A1i:Ng%C3%B4n_ng%E1%BB%AF_h%C3%A0m&action=edit&redlink=1), các bài viết Wikipedia về các ngôn ngữ cụ thể có tính năng lập trình hàm [Lập trình mệnh lệnh](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_m%E1%BB%87nh_l%E1%BB%87nh&action=edit&redlink=1) [Phép tính lambda](/wiki/Ph%C3%A9p_t%C3%ADnh_lambda) [Lập trình luận lý](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_lu%E1%BA%ADn_l%C3%BD&action=edit&redlink=1) [Hàm lồng nhau](/w/index.php?title=H%C3%A0m_l%E1%BB%93ng_nhau&action=edit&redlink=1) [Lập trình thủ tục](/wiki/L%E1%BA%ADp_tr%C3%ACnh_th%E1%BB%A7_t%E1%BB%A5c)
## Tham khảo[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C3%A0m&veaction=edit§ion=9) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C3%A0m&action=edit§ion=9)]
- ^
**a** **ă** **â** [Hudak, Paul](/w/index.php?title=Paul_Hudak&action=edit&redlink=1)(tháng 9 năm 1989). [“Conception, evolution, and application of functional programming languages”](http://www.cs.berkeley.edu/~jcondit/pl-prelim/hudak89functional.pdf)(PDF). [ACM](/w/index.php?title=Association_for_Computing_Machinery&action=edit&redlink=1)Computing Surveys **21**(3): 359–411. [doi](/wiki/DOI): [10.1145/72551.72554](//dx.doi.org/10.1145%2F72551.72554). **Clinger, Will (1987).** [^](#cite_ref-clinger1987_2-0) [“MultiTasking and MacScheme”](http://www.mactech.com/articles/mactech/Vol.03/03.12/Multitasking/index.html). *MacTech* **3**(12). Truy cập ngày 28 tháng 8 năm 2008. **Hartheimer, Anne (1987).** [^](#cite_ref-hartheimer1987_3-0) [“Programming a Text Editor in MacScheme+Toolsmith”](http://www.mactech.com/articles/mactech/Vol.03/03.1/SchemeWindows/index.html). *MacTech* **3**(1). Truy cập ngày 28 tháng 8 năm 2008. **Kidd, Eric.** [^](#cite_ref-kidd2007_4-0) [. CUFP 2007. Truy cập ngày 26 tháng 8 năm 2009.](http://cufp.galois.com/2007/abstracts.html#EricKidd) *Terrorism Response Training in Scheme* **Cleis, Richard.** [^](#cite_ref-cleis2006_5-0) [. CUFP 2006. Truy cập ngày 26 tháng 8 năm 2009.](http://cufp.galois.com/2006/abstracts.html#RichardCleis) *Scheme in Space* [^](#cite_ref-erlang-faq_6-0) [“Who uses Erlang for product development?”](http://www.erlang.org/faq/faq.html#AEN50). *Frequently asked questions about Erlang*. Truy cập ngày 5 tháng 8 năm 2007. **Armstrong, Joe (tháng 6 năm 2007).** [^](#cite_ref-armstrong2007_7-0) [. Third ACM SIGPLAN Conference on History of Programming Languages. San Diego, California. Truy cập ngày 29 tháng 8 năm 2009.](http://doi.acm.org/10.1145/1238844.1238850) *A history of Erlang* **Larson, Jim (tháng 3 năm 2009).** [^](#cite_ref-larson2009_8-0) [“Erlang for concurrent programming”](http://doi.acm.org/10.1145/1467247.1467263). *Communications of the ACM* **52**(3): 48. [doi](/wiki/DOI): [10.1145/1467247.1467263](//dx.doi.org/10.1145%2F1467247.1467263). Truy cập ngày 29 tháng 8 năm 2009. **Minsky, Yaron; Weeks, Stephen (tháng 7 năm 2008).** [^](#cite_ref-minksy2008_9-0) [“Caml Trading - experiences with functional programming on Wall Street”](http://journals.cambridge.org/action/displayAbstract?aid=1899164). *Journal of Functional Programming*(Cambridge University Press) **18**(4): 553–564. [doi](/wiki/DOI): [10.1017/S095679680800676X](//dx.doi.org/10.1017%2FS095679680800676X). Truy cập ngày 27 tháng 8 năm 2008. **Leroy, Xavier.** [^](#cite_ref-leroy2007_10-0) [(PDF). CUFP 2007. Truy cập ngày 26 tháng 8 năm 2009.](http://cufp.galois.com/2007/slides/XavierLeroy.pdf) *Some uses of Caml in Industry* [^](#cite_ref-haskell-industry_11-0) [“"Haskell in industry - Haskell Wiki”](http://www.haskell.org/haskellwiki/Haskell_in_industry). Truy cập ngày 26 tháng 8 năm 2009.
Haskell has a diverse range of use commercially, from aerospace and defense, to finance, to web startups, hardware design firms and lawnmower manufacturers.
[^](#cite_ref-hudak2007_12-0) [Hudak, Paul](/w/index.php?title=Paul_Hudak&action=edit&redlink=1)(tháng 6 năm 2007). [. Third ACM SIGPLAN Conference on History of Programming Languages. San Diego, California. Truy cập ngày 29 tháng 8 năm 2009. Đã bỏ qua tham số không rõ](http://doi.acm.org/10.1145/1238844.1238856) *A history of Haskell: being lazy with class*
|coauthores=(
[trợ giúp](https://en.wikipedia.org/wiki/Help:CS1_errors#parameter_ignored)) [^](#cite_ref-useR_13-0) [The useR! 2006 conference schedule includes papers on the commercial use of R](http://www.r-project.org/useR-2006/program.html) [^](#cite_ref-Chambers_14-0) [Chambers, John M.](/w/index.php?title=John_Chambers_(programmer)&action=edit&redlink=1)(1998). *Programming with Data: A Guide to the S Language*. Springer Verlag. tr. 67–70. [ISBN](/wiki/ISBN) [978-0387985039](/wiki/%C4%90%E1%BA%B7c_bi%E1%BB%87t:Ngu%E1%BB%93n_s%C3%A1ch/978-0387985039). **Department of Applied Math, University of Colorado.** [^](#cite_ref-Amath-CO_15-0) [“Functional vs. Procedural Programming Language”](http://amath.colorado.edu/computing/mmm/funcproc.html). Truy cập ngày 28 tháng 8 năm 2006. **Dimitre Novatchev.** [^](#cite_ref-Novatchev_16-0) [“The Functional Programming Language XSLT - A proof through examples”](http://www.topxml.com/xsl/articles/fp/). *TopXML*. Truy cập ngày 27 tháng 5 năm 2006. **David Mertz.** [^](#cite_ref-Mertz_17-0) [“XML Programming Paradigms (part four): Functional Programming approached to XML processing”](http://gnosis.cx/publish/programming/xml_models_fp.html). *IBM developerWorks*. Truy cập ngày 27 tháng 5 năm 2006. [^](#cite_ref-Chamberlin_Boyce_18-0) [Donald D. Chamberlin](/w/index.php?title=Donald_D._Chamberlin&action=edit&redlink=1)và [Raymond F. Boyce](/w/index.php?title=Raymond_F._Boyce&action=edit&redlink=1)(1974). “SEQUEL: A structured English query language”. *Proceedings of the 1974 ACM SIGFIDET*: 249–264.. In this paper, one of the first formal presentations of the concepts of SQL (and before the name was later abbreviated), Chamberlin and Boyce emphasize that SQL was developed "Without resorting to the concepts of bound variables and quantifiers". [^](#cite_ref-excel_19-0) [Simon Peyton Jones](/w/index.php?title=Simon_Peyton_Jones&action=edit&redlink=1), [Margaret Burnett](/w/index.php?title=Margaret_Burnett&action=edit&redlink=1), [Alan Blackwell](/w/index.php?title=Alan_Blackwell&action=edit&redlink=1)(tháng 3 năm 2003). [“Improving the world's most popular functional language: user-defined functions in Excel”](http://research.microsoft.com/~simonpj/papers/excel/index.htm). [^](#cite_ref-20) [Dominus, Mark J.](/w/index.php?title=Mark_Jason_Dominus&action=edit&redlink=1)(2005). *Higher-Order Perl*. [Morgan Kaufmann](/w/index.php?title=Morgan_Kaufmann&action=edit&redlink=1). [ISBN](/wiki/ISBN) [1558607013](/wiki/%C4%90%E1%BA%B7c_bi%E1%BB%87t:Ngu%E1%BB%93n_s%C3%A1ch/1558607013). **Crockford, Douglas (2001).** [^](#cite_ref-crockford-javascript_21-0) [“JavaScript: The World's Most Misunderstood Programming Language”](http://www.crockford.com/javascript/javascript.html). "JavaScript's C-like syntax, including curly braces and the clunky for statement, makes it appear to be an ordinary procedural language. This is misleading because JavaScript has more in common with functional languages like Lisp or Scheme than with C or Java. It has arrays instead of lists and objects instead of property lists. Functions are first class. It has closures. You get lambdas without having to balance all those parens." (For discussion on JavaScript as a functional programming language, see [Talk:JavaScript#Function-level vs. functional programming](/wiki/Th%E1%BA%A3o_lu%E1%BA%ADn:JavaScript#Function-level_vs._functional_programming)). **Dick Pountain.** [^](#cite_ref-22) [“Functional Programming Comes of Age”](http://www.byte.com/art/9408/sec11/art1.htm). *BYTE.com (August 1994)*. Truy cập ngày 31 tháng 8 năm 2006. [^](#cite_ref-totalfp_23-0) [Turner, D.A.](/w/index.php?title=David_Turner_(computer_scientist)&action=edit&redlink=1)(ngày 28 tháng 7 năm 2004). [“Total Functional Programming”](http://www.jucs.org/jucs_10_7/total_functional_programming). *Journal of Universal Computer Science* **10**(7): 751–768. [doi](/wiki/DOI): [10.3217/jucs-010-07-0751](//dx.doi.org/10.3217%2Fjucs-010-07-0751). [^](#cite_ref-24) [John Hughes](/w/index.php?title=John_Hughes_(computer_scientist)&action=edit&redlink=1). [“Why Functional Programming Matters”](http://www.math.chalmers.se/~rjmh/Papers/whyfp.html). **John Launchbury (1993).** [^](#cite_ref-25) [“A Natural Semantics for Lazy Evaluation”](http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.35.2016). [^](#cite_ref-26) [Robert W. Harper](/w/index.php?title=Robert_Harper_(computer_scientist)&action=edit&redlink=1)(2009). [(PDF). (in preparation), section XIV.](http://www.cs.cmu.edu/~rwh/plbook/book.pdf) *Practical Foundations for Programming Languages* [^](#cite_ref-27) [“The Compcert verified compiler”](http://compcert.inria.fr/doc/index.html). **Simon Peyton Jones, Dimitrios Vytiniotis, Stephanie Weirich, and Geoffrey Washburn.** [^](#cite_ref-28) [“Simple unification-based type inference for GADTs”](http://research.microsoft.com/en-us/um/people/simonpj/papers/gadt/). *ICFP 2006*. tr. 50–61. **Andrew Kennedy and Claudio Russo (tháng 10 năm 2005).** [^](#cite_ref-29) [“Generalized Algebraic Data Types and Object-Oriented Programming”](http://research.microsoft.com/~akenn/generics/gadtoop.pdf)(PDF). *OOPSLA*. San Diego, California. [source of citation](http://lambda-the-ultimate.org/node/1134) **Hartel, Pieter; Henk Muller and Hugh Glaser (tháng 3 năm 2004).** [^](#cite_ref-30) [“The Functional C experience”](http://www.ub.utwente.nl/webdocs/ctit/1/00000084.pdf)(PDF). *The Journal of Functional Programming* **14**(2): 129–135. [doi](/wiki/DOI): [10.1017/S0956796803004817](//dx.doi.org/10.1017%2FS0956796803004817). ; David Mertz. [“Functional programming in Python, Part 3”](http://www-128.ibm.com/developerworks/linux/library/l-prog3.html). *IBM developerWorks*. Truy cập ngày 17 tháng 9 năm 2006.( [Part 1](http://www-128.ibm.com/developerworks/library/l-prog.html), [Part 2](http://www-128.ibm.com/developerworks/library/l-prog2.html)) **McNamara, B.** [^](#cite_ref-31) [“FC++: Functional Programming in C++”](http://www-static.cc.gatech.edu/~yannis/fc++/). Truy cập ngày 28 tháng 5 năm 2006. **Miller, Jeremy (2009).** [^](#cite_ref-32) [“Functional Programming for Everyday.NET Development”](http://msdn.microsoft.com/en-us/magazine/ee309512.aspx). The Language Integrated Query (LINQ) feature in all of its many incarnations is an obvious and powerful use of functional programming in.NET, but that's just the tip of the iceberg. **See Item 15 in the book** [^](#cite_ref-33) **Effective Java, Second Edition**by Joshua Bloch
## Đọc thêm[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C3%A0m&veaction=edit§ion=10) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C3%A0m&action=edit§ion=10)] [Abelson, Hal](/w/index.php?title=Hal_Abelson&action=edit&redlink=1); [Sussman, Gerald Jay](/w/index.php?title=Gerald_Jay_Sussman&action=edit&redlink=1)(1985). [. MIT Press. Tựa đề URL chứa liên kết wiki (](http://mitpress.mit.edu/sicp/) *[[Structure and Interpretation of Computer Programs]]* [trợ giúp](https://en.wikipedia.org/wiki/Help:CS1_errors#wikilink_in_url))
- Cousineau, Guy and Michel Mauny.
*The Functional Approach to Programming*. Cambridge, UK: [Cambridge University Press](/wiki/Cambridge_University_Press), 1998.
- Curry, Haskell Brooks and Feys, Robert and Craig, William.
*Combinatory Logic*. Volume I. North-Holland Publishing Company, Amsterdam, 1958. [Curry, Haskell B.](/w/index.php?title=Haskell_Curry&action=edit&redlink=1); [Hindley, J. Roger](/w/index.php?title=J._Roger_Hindley&action=edit&redlink=1); [Seldin, Jonathan P.](/w/index.php?title=Jonathan_P._Seldin&action=edit&redlink=1)(1972). *Combinatory Logic*. Vol. II. Amsterdam: North Holland. [ISBN](/wiki/ISBN) [0-7204-2208-6](/wiki/%C4%90%E1%BA%B7c_bi%E1%BB%87t:Ngu%E1%BB%93n_s%C3%A1ch/0-7204-2208-6). [Dominus, Mark Jason](/w/index.php?title=Mark_Jason_Dominus&action=edit&redlink=1). *.* [Higher-Order Perl](/w/index.php?title=Higher-Order_Perl&action=edit&redlink=1) [Morgan Kaufmann](/w/index.php?title=Morgan_Kaufmann&action=edit&redlink=1). 2005.
- Felleisen, Matthias; Findler, Robert; Flatt, Matthew; Krishnamurthi, Shriram (2001).
[. MIT Press. Tựa đề URL chứa liên kết wiki (](http://www.htdp.org) *[[How to Design Programs]]* [trợ giúp](https://en.wikipedia.org/wiki/Help:CS1_errors#wikilink_in_url))
- Graham, Paul.
*ANSI Common LISP*. Englewood Cliffs, New Jersey: [Prentice Hall](/w/index.php?title=Prentice_Hall&action=edit&redlink=1), 1996.
- MacLennan, Bruce J.
*Functional Programming: Practice and Theory*. Addison-Wesley, 1990.
- O'Sullivan, Brian; Stewart, John; Goerzen, Don (2008).
[. O'Reilly.](http://book.realworldhaskell.org/read/) *Real World Haskell*
- Pratt, Terrence, W. and Marvin V. Zelkowitz.
*Programming Languages: Design and Implementation*. 3rd ed. Englewood Cliffs, New Jersey: [Prentice Hall](/w/index.php?title=Prentice_Hall&action=edit&redlink=1), 1996.
- Salus, Peter H.
*Functional and Logic Programming Languages*. Vol. 4 of Handbook of Programming Languages. Indianapolis, Indiana: [Macmillan Technical Publishing](/w/index.php?title=Macmillan_Technical_Publishing&action=edit&redlink=1), 1998.
- Thompson, Simon.
*Haskell: The Craft of Functional Programming*. Harlow, England: [Addison-Wesley Longman Limited](/w/index.php?title=Addison-Wesley_Longman_Limited&action=edit&redlink=1), 1996.
## Liên kết ngoài[
[sửa](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C3%A0m&veaction=edit§ion=11) | [sửa mã nguồn](/w/index.php?title=L%E1%BA%ADp_tr%C3%ACnh_h%C3%A0m&action=edit§ion=11)] [Functional Programming for the Rest of Us](http://www.defmacro.org/ramblings/fp.html)An introduction by Slava Akhmechet *Functional programming in Python*(by David Mertz): [part 1](http://gnosis.cx/publish/programming/charming_python_13.html), [part 2](http://gnosis.cx/publish/programming/charming_python_16.html), [part 3](http://gnosis.cx/publish/programming/charming_python_19.html) [The Implementation of Functional Programming Languages](http://research.microsoft.com/~simonpj/papers/slpj-book-1987/index.htm) [Simon Peyton Jones](/w/index.php?title=Simon_Peyton_Jones&action=edit&redlink=1), published by [Prentice Hall](/w/index.php?title=Prentice_Hall&action=edit&redlink=1), 1987.
|
|
· · · · · · Lập trình hàm · · · · · · · ·
Chú ý: khoa học máy tính còn có thể được chia thành nhiều chủ đề hay nhiều lĩnh vực khác dựa theo

WARC-Type: response

Content-Type: application/http; msgtype=response

WARC-Truncated: length

Set-Cookie: GeoIP=US:VA:Ashburn:39.05:-77.47:v4; Path=/; secure; Domain=.wikipedia.org

Connection: close

X-Content-Type-Options: nosniff

Cache-Control: private, s-maxage=0, max-age=0, must-revalidate

X-Cache-Status: miss

P3P: CP="This is not a P3P policy! See https://vi.wikipedia.org/wiki/%C4%90%E1%BA%B7c_bi%E1%BB%87t:CentralAutoLogin/P3P for more info."

Via: 1.1 varnish-v4, 1.1 varnish-v4

Content-Language: vi

X-UA-Compatible: IE=Edge

X-Cache: cp2004 miss, cp2019 miss

Vary: Accept-Encoding,Cookie,Authorization

Accept-Ranges: bytes

Content-Type: text/html; charset=UTF-8


text:
Thể loại:Scorpions
Bách khoa toàn thư mở Wikipedia
Bài chính thể loại: Scorpions
Thể loại con
Thể loại này gồm 3 thể loại con sau, trên tổng số 3 thể loại con.
A
- ► Album của Scorpions (2 tr.)
B
- ► Bài hát của Scorpions (3 tr.)
T
- ► Thành viên Scorpions (6 tr.)
Các trang trong thể loại “Scorpions”
3 trang sau nằm trong thể loại này, trên tổng số 3 trang.

markdown:
# Thể loại:Scorpions
Bách khoa toàn thư mở Wikipedia
*Bài chính thể loại:* [Scorpions](/wiki/Scorpions)
|
|![]()
|Wikimedia Commons có thư viện hình ảnh và phương tiện truyền tải về
|
## Thể loại con
Thể loại này gồm 3 thể loại con sau, trên tổng số 3 thể loại con.
### A
- ►
[Album của Scorpions](/wiki/Th%E1%BB%83_lo%E1%BA%A1i:Album_c%E1%BB%A7a_Scorpions) (2 tr.)
### B
- ►
[Bài hát của Scorpions](/wiki/Th%E1%BB%83_lo%E1%BA%A1i:B%C3%A0i_h%C3%A1t_c%E1%BB%A7a_Scorpions) (3 tr.)
### T
- ►
[Thành viên Scorpions](/wiki/Th%E1%BB%83_lo%E1%BA%A1i:Th%C3%A0nh_vi%C3%AAn_Scorpions) (6 tr.)
## Các trang trong thể loại “Scorpions”
3 trang sau nằm trong thể loại này, trên tổng số 3 trang.

X-Cache: cp2007 miss, cp2019 miss