Funtional paradigm 1 Gii thiu Hu ht các ngôn ng lp trình t trc n nay c xây dng da trên nguyên lý
kin trúc máy tính Von Neumann. Lp ch yu trong các ngôn ng ó là các ngôn ng ra lnh. Ðn v làm vic trong mt chng trình là câu lnh. Kt qu ca tng câu lnh c t hp li thành kt qu ca c chng trình. Các ngôn ng này bao gm: FORTRAN, COBOL, Pasacl, Pasac l, Ada... Mc dù ngôn ng ng ra lnh ã c h u ht ngi lp trình chp nhn nhng s liên liên h cht ch vi kin trúc máy tính là mt mt hn ch n vic phát trin phn mm. Ngôn ng lp trình hàm c thit k da trên các hàm toán hc là mt trong nhng ngôn ng không ra lnh quan trng nht. Lp trình hàm là mt mô hình lp trình xem vic tính toán là s ánh giá các hàm toán hc và tránh s dng trng thái và các d liu bin i. Lp trình hàm nhn mnh vic ng dng hàm s, trái vi phong cách lp trình mnh lnh, nhn mnh vào s thay i trng thái. Lp trình hàm xut phát t phép tính lambda, lambda, mt h thng hình thc c phát trin vào nhng nm 1930 nghiên cu nh ngha hàm s, ng dng ca hàm s, và quy. Nhiu ngôn ng lp trình hàm có th t h c xem là là nhng cách phát trin gii tích lambda. 2 Hàm toán hc Hàm là mt s tng ng gia các phn t ca mt tp hp (min xác nh) vi các phn t ca mt tp hp khác (min giá tr). Ðnh ngha hàm xác nh min xác nh, min giá tr tr và quy tc tng ng gia các ph n t ca min xác nh vi các ph n t ca min giá tr. Thông thng s tng ng c mô t bi mt biu thc. Hàm toán
hc có hai c trng c bn là: * Th t ánh giá biu thc c iu khin bi s quy và biu thc iu kin ch không phi bng cách lp li và liên tip nh trong các ngôn ng ra lnh. * Hàm toán hc không có hiu ng l cho nên vi cùng mt tp i s, hàm toán hc luôn cho cùng mt kt qu. S khác bit gia hàm s toán hc và cách dùng t "hàm" trong lp trình mnh lnh ó là các hàm mnh lnh có th to ra hiu ng l, làm thay i giá tr ca mt phép tính trc ó. Vì vy các hàm kiu này thiu tính trong tro ng sut tham chiu, chiu , có ngha là cùng mt biu thc ngôn ng li có th to ra nhiu giá tr khác nhau vào các thi im khác nhau tùy thuc vào trng thái ca chng trình ang thc thi. Ngc li, trong lp trình hàm, giá tr xut ra ca mt hàm ch ph thuc t huc vào các tham s u vào ca hàm, vì th gi hàm f hai ln vi cùng giá tr tham s x s cho ra cùng kt qu f(x). Vic loi b hiu ng l có th làm cho chng trình d hiu hn rt nhiu và ngi ta có d oán c hành vi ca mt chng trình, ó chính là mt trong các ng lc chính cho s phát trin ca lp trình hàm.
3 Ngôn ng lp trình hàm Mc ich ca vic thit k ngôn ng lp trình hàm là mô phng các hàm toán hc mt cách nhiu nht có th c. Trong ngôn ng ra lnh, mt biu thc c ánh giá và kt qu ca nó c lu tr trong ô nh c biu din bi mt bin trong chng trình. Ngc li, trong ngôn ng lp trình hàm k hông s dng bin và do ó không cn lnh gán. Ðiu này gii phóng ngi lp trình khi mi quan tâm v ô nh ca máy tính trong khi thc hiên chng trình. Không có bin cho nên không có cu trúc lp (vì cu trúc lp c iu khin bi bin). Các lnh l p li s c x lý bng gii pháp quy. Chng trình là các nh ngha hàm và các áp dng hàm. S thc hin là vic ánh giá các áp dng hàm. S thc hin mt hàm luôn cho cùng mt kt qu khi ta cho nó cùng mt i s. iu này gi là trong sut tham k ho (referential transparancy). Nó cho thy rng ng ngha ca ngôn ng lp trình hàm n gin hn ng ngha ca ngôn ng lp trình ra lnh và ngôn ng hàm bao gm c nhng nét c bit ca ngôn ng ra lnh. Ngôn ng hàm cung cp mt tp hp các hàm nguyên thy, mt tp các dng hàm xây dng các hàm phc tp t các hàm ã có. Ngôn ng cng cung cp mt phép toán áp dng hàm và các cu trúc lu tr d liu. Mt ngôn ng hàm c thit k tt là mt ngôn ng có tp hp nh các hàm nguyên thy Các ngôn ng lp trình hàm, c bit là các loi thu n lp trình hàm, có nh hng ln trong gii hc thut hn là dùng phát trin các ph n mm thng mi. Tuy vy, các ngôn ng lp trình hàm ni bt nh Scheme, Erlang, Objective Caml,và Haskell ã c nhiu t chc khác nhau s dng trong các ng dng công nghip và thng mi. Lp trình theo phong cách lp trình hàm cng có th thc hin các ngôn ng không c thit k riêng cho lp trình hàm. Ví d, ngôn ng lp trình mnh lnh Perl ã có mt cun sách vit v cách áp dng các khái nim lp trình hàm vào ó. JavaScript, mt trong các ngôn ng c dùng nhiu hin na y, có kh nng lp trình hàm. 4 4.1
Các
khái nim
Hàm
hng nht và hàm bc cao
Hàm bc cao là các hàm s hoc có th nhn các hàm s khác làm tham s hoc có th tr v kt qu là hàm s (phép toán vi phân d / d x tính vi phân ca hàm f là mt ví
d ca hàm bc cao trong gii tích). Các hàm bc cao có liên h cht ch vi hàm hng nht, ch các hàm bc cao và hàm hng nht u cho phép nhn hàm s làm tham s và tr v các hàm khác. S khác bit gia hai loi này rt m nht: "bc cao" mô t mt khái nim hàm t rong toán hc tính toán trong các hàm khác, còn "hàm hng nht" là mt thut ng ca ngành khoa hc máy tính mô t các thc th ca ngôn ng lp trình trong ó không có gii hn v vic s dng (vì vy các hàm hng nht có th xut hin bt c âu tron g
chng trình, ging nh các thc th hng nht khác nhau con s, trong ó có c vic làm tham s cho các hàm khác và làm giá tr tr v ca hàm khác). Các hàm bc cao cho phép áp dng bán phn hoc currying, mt k thut trong ó hàm ln lt s dng tng tham s ca nó, mi l n s dng li tr v mt hàm mi và chp nhn tham s tip theo. Vic làm này cho phép ngi lp trình biu din mt cách súc tích hàm s k tha, tng t nh toán t cng s l n lt cng tng s t nhiên li vi nhau. 4.2
Hàm
thun túy
Các hàm (hoc biu thc) thun túy hàm không có b nh hoc các hiu ng l nhp/xut. iu này có ngha là các hàm thun túy có mt s c tính hu ích, mà a s trong chúng có th dùng ti u mã ngun: y
y
y
y
4.3
Nu kt qu ca mt biu thc thu n túy không c s dng, ta có th xóa nó i mà không nh hng n các biu thc khác. Nu mt hàm thun túy c gi cùng vi các tham s không to ra hiu ng l, kt qu s là hng s tng ng vi danh sách tham s c th (có khi gi là trong sut tham chiu), tc là hàm thun túy nu c gi ln na vi cùng b tham s, kt qu tr v cng s y ht nh trc (iu này cho phép ti u hóa lu m nh memoization). Nu không có s ph thuc v d liu gia hai biu thc thu n túy, thì th t ca chúng có th o cho nhau, hoc chúng có th thc hin song song mà không nh hng n nhau (hay nói cách khác, ánh giá mt biu thc thun túy bt k là an toàn v lung (thread-safe)). Nu toàn b ngôn ng không cho phép hiu ng l, thì chin thut ánh giá hàm nào cng dùng c; vic này trao cho trình biên dch quyn t do sp xp li hoc phi hp vic ánh giá biu thc trong mt chng trình (ví d, dùng k thut loi b cây).
quy
Vòng lp trong các ngôn ng hàm thng c thc hin thông qua quy. Hàm quy s t gi chính nó, cho phép thc hin i thc hin li mt tác v. Vic quy có th òi hi phi s dng mt chng (stack), nhng quy uôi vn có th c trình biên dch nhn ra và ti u hóa nó thành cùng on mã c dùng hin thc vòng lp trong ngôn ng mnh lnh. Tiêu chun ca ngôn ng Scheme là phi nhn din và ti u hóa c quy uôi. Mt trong nhng cách ti u hóa quy uôi là chuyn chng trình thành kiu truyn liên tip trong quá trình dch. Các mu quy ph bin u có th c kh quy bng các hàm bc cao, catamorphism và anamorphism (hay "fold" và "unfold" - gp và m gp) là nhng ví d rõ nht. Các hàm bc cao nh vy óng vai trò tng t nh các cu trúc iu khin có sn nh vòng lp trong ngôn ng mnh lnh.
a s các ngôn ng lp trình hàm a mc ích u cho phép quy không gii hn và là Turing complete, khin cho bài toán dng tr nên không quyt nh c, có th gây ra s thiu cn c cho vic suy din công thc, và nói chung òi hi phi có khái nim không nht quán trong logic do h thng kiu ca ngôn ng quy nh. Mt vài ngôn ng lp trình vi mc ích c bit nh Coq ch cho phép quy well -founded và chun hóa mnh (tính toán không dng ch có th biu din bng dòng giá tr vô hn gi là codata). Kt qu là, nhng ngôn ng nh vy không phi Turing complete và mt s hàm không th biu din trong ngôn ng, dù ngôn ng ó vn có th biu din c rt nhiu cách tính toán thú v mà tránh c vn do quy không gii hn gây ra. Lp trình hàm gii hn trong vic quy well-founded vi mt s ràng buc khác c gi là lp trình hàm hoàn toàn (total). 4.4
nh toán cht và không cht
Tí
Có th chia các ngôn ng hàm làm hai loi tùy vào vic chúng s dng cách tính toán biu thc cht ( tham lam ) hay k hông cht ( li bing ) , là nhng khái nim ch cách x lý thông s ca hàm khi tính toán mt biu thc. S khác bit v các cách tính toán này xut hin ng ngha biu th ca biu thc khi chúng có cha phép toán li hoc có vn . Khi tính toán cht, vic tính toán s hng có cha li cng s dn n li. Ví d, biu thc print length([2+1, 3*2, 1/0, 5-4]) s không tính c theo tính toán cht vì phép chia không ti ph n t th 3 ca danh sách. Còn vi tính toán không cht, hàm length s tr v giá tr 4, vì khi tính toán hàm, nó không c gng tính toán các ph n t trong danh sách. Nói mt cách ngn gn, tính toán cht luôn luôn tính toán tt c cc s hng ca hàm trc khi x lý hàm. Tính toán không cht không tính toán tham s ca hàm tr khi nó c n giá tr ó tính toán hàm. Cách hin thc thông thng ca tính toán không cht trong ngôn ng hàm là thu gim th. Cách tính toán không cht c dùng mc nh trong vài ngôn ng lp trình hàm thun túy, nh Miranda, Clean và Haskell. 4.5
H thng
kiu, tí nh a hình, kiu d liu i s và so trùng m u
c bit k t s phát trin ca lun kiu Hindley±Milner trong thp niên 1970, các ngôn ng lp trình hàm có khuynh hng s dng phép tính lambda nh kiu, chng li phép tính lambda bt nh kiu ã c dùng trong Lisp và các bin th ca nó (nh Scheme). Vic s dng các kiu d liu i s và so trùng mu làm cho vic thao tác các cu trúc d liu phc tp tr nên thun tin và rõ ràng hn; s tn ti ca vic kim tra kiu mnh m trong thi gian biên dch làm cho các chng trình tr nên áng tin cy hn, trong khi ó lun kiu gii phóng lp trình viên khi vic c n phi khai báo th công các kiu biên dch. Mt s ngôn ng lp trình hàm nh hng nghiên cu nh Coq, Agda, Cayenne, và Epigram da trên lí thuyt kiu intuitionistic, thuyt này cho phép các kiu ph thuc
vào các term. Các kiu nh vy c gi là các kiu ph thuc. Các h thng kiu này không có các lun kiu kh nh và rt khó hiu và lp trình vi chúng. Nhng các kiu ph thuc này có th mô t các mnh t do trong logic mnh . Thông qua Curry± Howard isomorphism, sau ó, các chng trình nh kiu tt trong nhng ngôn ng này s tr thành các phng tin cho vic vit các chng minh toán hc hình thc mà t ó mt trình biên dch có th sinh ra mã c chng nhn. Trong khi nhng ngôn ng này ch yu c quan tâm trong nghiên cu hc thut (k c trong toán hc hình thc hóa), chúng cng bt u c s dng trong k thut. Compcert là mt trình biên dch cho mt tp con ca ngôn ng lp trình C c vit bng Coq và ã c chng thc chính thc. Mt dng gii hn ca các kiu ph thuc c gi là kiu d liu i s c khái quát hóa (GADT). Dng này có th c thc hin theo cách cung cp mt vài trong s các li ích ca lp trình ph thuc kiu trong khi tránh h u ht s bt tin ca nó . GADT có sn trong Trình biên dch Glasgow Haskell và trong Scala (nh "case classes"), và c cho là phn b sung vào các ngôn ng khác bao gm c Java và C#. 4.6
p trình hàm trong các ngôn ng phi hàm
L
Có th s dng phong cách hàm ca vic lp trình trong các ngôn ng mà theo truyn thng không c xem là ngôn ng hàm. Mt s ngôn ng phi hàm ã mn nhiu c im nh các hàm bc cao hn, và các quan nim danh sách t các ngôn ng lp trình hàm. iu này làm cho vic chp nhn phong cách hàm d dàng hn khi s dng nhng ngôn ng này. Các cu trúc hàm nh các "hàm bc cao hn" và các "danh sá ch li" có th ly c trong C++ qua các th vin. Trong C, các con tr hàm có th c dùng t c mt vài trong s các hiu qu ca các hàm bc cao hn. Ví d hàm chung map có th c thc thi bng cách dùng các con tr hàm. Trong Visual Basic 9 và C# 3.0 và cao hn, các hàm lambda có th c dùng vit các chng trình theo phong cách hàm. Trong Java, các lp nc danh ôi khi c s dng mô phng các s óng, tuy nhiên các lp nc danh không phi luôn luôn là các thay th chính xác cho các s óng bi vì chúng có nhiu kh nng b hn ch hn. Nhiu mu thit k hng i tng có th biu t bng các thut ng lp trình hàm: ví d, mu chin lc n gin ch ra cách dùng ca hàm bc cao hn, và mu khách ving thm gn nh tng ng vi mt catamorphism, hoc fold. Các ích li ca d liu bt bin có th c thy ngay c trong các chng trình mnh lnh, vì th các lp trình viên thng xuyên c gng làm cho mt s d liu bt bin ngay c trong các chng trình mnh lnh.