Funkciaj lingvoj

**Funkciaj lingvoj** estas speco de komputillingvoj, kiuj havas
apartan programadan stilon kompare al ordonemaj lingvoj.  Kontraste kun
ordonemaj programoj, kiuj estas vicoj de ordonoj plenumendaj unu
post la alia, funkcia programo estas unuopa esprimo (aŭ formulo),
kiun oni plenumas per komputi la esprimon.

Do ne estu surprizo, ke funkciaj lingvoj estas bazitaj de
matematiko.  Ekzemple, la funkciaj lingvoj Haskell kaj
Lisp baziĝas sur la Lambdokalkulo.  Kaj tiu bazo estas utila
por tradukiloj, kiuj povas matematike rezoni pri la programo por pli
inteligente traduki ĝin ol kutime povas tradukiloj por ordonemaj
lingvoj.  Kutima funkcio plenumita de tradukiloj por funkciaj lingvoj
estas kontroli erarojn.  Funkciaj lingvoj pli facile ebligas la
trovadon de eraroj antaŭ ol ruli la programon.  Do multaj rultempaj
eraroj en ordonemaj programoj estas malpli seriozaj traduktempaj
eraroj en funkciaj lingvoj.

## Ekzemploj 
Lisp, Scheme, Haskell, ML, Caml, Clean, Erlang, Elm

## Enkonduko al funkciaj lingvoj 
Iuj, kiuj uzis sterntabelon, jam spertas pri funkcia
programado.  En sterntabelo oni specifas la valorojn de ĉiu ĉelo
laŭ la valoroj de aliaj ĉeloj.  Gravas, kio estas komputota,
ne kiel komputi ĝin.  Ekzemple: oni ne specifas la ordon, laŭ kiu la
ĉeloj estu komputitaj; anstataŭe, oni akceptas, ke la sterntabelo
komputos la ĉelojn laŭ la ordo, kiu respektas la dependecojn inter la
ĉeloj.  Oni ne specifas, kiel la sterntabulo asignu memoron;
anstataŭe, oni atendas, ke ĝi montru al ni senliman tabulon da ĉeloj
kaj asignu nur la memoron necesan por la ĉeloj uzataj.  Plejparte,
oni specifas la valoron de ĉelo per esprimo (kies subpartoj povas
esti komputitaj laŭ ajna ordo), anstataŭ vico de ordonoj.

Interesa rezulto de la nespecifita ordo de kalkulado estas, ke la
koncepto de valorizo estas ne utila.  Tio forte kontrastas kun
tradiciaj ordonemaj lingvoj, en kiuj valorizo estas esenca koncepto
kaj en kiuj la ordo de la ordonoj estas gravega al la signifo de la
programo.

La celo al la altnivela "kio" anstataŭ malaltnivela "kiel" estas
distingaĵo de funkciaj komputillingvoj.

Alia bone konata preskaŭ-funkcia lingvo estas la norma datumbaz-demanda lingvo (SQL).  Demando en SQL estas esprimo kun
projekcioj, elektoj, kunigoj, ktp.  La demando specifas, kiu rilato
estu komputita, sen specifi, kiel ĝi estu komputita.  Tiu eco de la
demando permesas, ke ĝi povas esti komputita laŭ iu ajn konvena ordo.
Realigoj de SQL ofte amplekse optimumigas la demandojn, determinante, inter
aliaj aferoj, la plej bonan ordon laŭ kiu komputi la
esprimon.

Sterntabuloj kaj SQL estas tre specialigitaj lingvoj.  Veraj funkciaj
lingvoj prenas la samajn ideojn kaj translokas ilin al la nivelo de
ĝeneralcela programado.

## Kio estas la avantaĝoj de funkcia programado? 
*Mallongeco*: Funkciaj programoj emas esti pli koncizaj ol ordonemaj.

*Facileco de kompreno*: Funkciaj programoj ofte estas pli facile
kompreneblaj.  Tio povas esti bona por serĉi problemojn en la programo.
Tio povas esti bona ankaŭ por projektoj, se novaj homoj devas legi
aŭ ŝanĝi ion en programo ne originale verkita de ili, aŭ se la
originala aŭtoro forlasis la programon kaj post longe volas
mem reveni kaj facile rememori, kion li verkis.

*Neniu nekropsio*: La plej multaj funkciaj lingvoj estas tipizemaj lingvoj.  Tipkontrolado ĉe traduktempo nuligas grandan aron de
tiperaroj, kiuj kondukas al rultempa halto de la programo.  Simple ne
eblas en tipizemaj lingvoj, ekzemple, trakti entjeron kiel referencon.

*Reuzado de programpecoj*: Funkciaj lingvoj ofte enhavas homonimigon
de operacisimboloj.  Tiel la sama funkcio povas funkcii por multaj
tipoj, sen neceso de aparta difino por ĉiuj tipoj.

*Abstrakteco*: Per funkciaj lingvoj la programisto povas esprimi la
plej altnivelan algoritmon sen tro zorgi pri la detaloj.  Kaj funkciaj
lingvoj estas blokemaj lingvoj kaj tial estas facile apartigi la
sendependajn partojn de la programo por pli bone rezoni pri la unuopaj
partoj, sen esti konfuzita per la interfunkciado de la tuto.

*Nur tiom kiom necesas*: Funkciaj lingvoj povas esti *nestriktaj*.
Tio signifas, ke la komputilo komputas nur tiom, kiom necesas por atingi
la rezulton de la programo.  Kaj tio permesas pli blokecan stilon, per
kiu oni povas krei iom malŝparemajn (sed pli simplajn kaj pli
ĝeneralajn) blokojn, sed la aldona laboro ne efektiviĝus.

*Enkonstruita memor-direktado*: En lingvoj kia C (programlingvo), la programisto
respondecas pri la asignado de memoro.  En funkciaj lingvoj, tiujn decidojn
prizorgas la tradukilo kaj la rultemp-sistemo.

Tiu ĉi listo ne celas konvinki la leganton, ke funkciaj programoj
estas ĉiam la plej taŭgaj lingvoj.  Povas esti situacioj, kiam aliaj
lingvoj, kia C, estas pli taŭgaj.