Intrebarile incepatorului/Primele intrebari

From HaskellWiki
< Intrebarile incepatorului
Revision as of 23:07, 9 April 2021 by Atravers (talk | contribs) (Contents of various "micro-topic" pages aggregated into single page)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
Haskell - Un limbaj functional pur


De ce sa studiem tehnologii si limbaje deosebite ?

Contactul cu un limbaj de programare nou naste intrebari, mai ales cand este vorba de un limbaj atat de inovator. Cea mai buna cale de a va familiariza cu Haskell este sa conversati cu un interpretor, cum este Hugs. Sau sa folositi GHC si sa conversati cu GHCi (GHC Interactiv).

De ce sa studiem tehnologii si limbaje deosebite, Haskell sau Oberon sau Linux samd ?

. Ofera o crestere de salariu

Statisticile arata ca, in medie, cei care pe linga tehnologiile larg promovate (Windows (TM) , C , Java ...) stiu si alte tehnologii sau sisteme de operare alternative (ex. Linux, Python, etc) au salariile cu circa 30% mai mari. Procentul poate varia dar pentru orice patron care are o solutie client server cu server Linux si client Windows va fi mai economic sa angajeze un singur specialist in ambele platforme decat doi oameni.


. Maresc sansele de a accesa diferite job-uri

Exista posturi de la care candidatii au fost respinsi in deoarece nu cunosteau o tehnologie sau un sistem de operare mai rar folosit.


. Licentele libere avantajeaza

Existenta licentelor libere, BSD si similare (GHC si Haskell au asemenea licente BSD) avantajeaza atat angajatul cat si patronul:

  • angajatul poate obtine rapid si ieftind documentare si sprijin din partea comunitatii profesionale, inclusiv cod de aplicatii pentru a-l dezvolta
  • nu exista costuri de licentiere cand testati sau implementati o tehnologie noua
  • exista comunitati active care va sprijina
  • nu veti fi inlantuiti de un furnizor
  • costurile de pornire sunt mai mici

. DSL-urile maresc productivitatea

Limbajele specializate de programare, destinate anumitor sarcini profesionale, maresc productivitatea muncii. Ori Haskell este simultan un DSL si un limbaj de implementare a DSL-urilor. (DSL - domain small language). Este mult mai usor sa scrii o aplicatie - pe termen lung, fireste - daca dispui de un mic limbaj specializat pentru scrierea ei, in care ai comenzi puternice si adecvate. Si de ce nu ai scrie singur un asemenea mic limbaj, numit DSL (domain small language) ? Haskell iti permite asa ceva - ceea ce nici nu visai !!

. Ofera sanse mai mari de a gasi job-uri in strainatate

Deoarece programatori de C si Java sunt peste tot, sansele de a gasi un job in strainatate nu sunt de neglijat daca stiti tehnologii alternative.


. Ofera alta viziune

Spre deosebire de tehnologiile proprietare care incifreaza (vedeti Blaga :)) tainele lumii informatice, software-ul si sistemele de operare alternative va deschid noi porti de cunoastere. Sau va arata esenta dincolo de amanunte.

Desxpre limbaje se afirma (autor ??) ca un limbaj nou merita sa fie invatat daca iti schimba perspectiva asupra programarii, aducandu-ti noi concepte. Haskell este un astfel de limbaj novator. Linux este un asemenea sistem de operare aducator de noi cunostinte (si la propriu si la figurat).

. Ca sa evitam intamplari paguboase ca urmatoarea

La o universitate un lector a predat Oberon si Linux. Un cadru de conducere al facultatii tehnice i-a sugerat sa renunte la Oberon inlocuindu-l cu C sau ceva similar. O sefa de catedra i-a luat cursul de Linux inlocuindu-l cu unul de MS-DOS si altele facut de un onorabil conferentiar. Recent universitatea a primit de la o firma o propunere de contract sa dezvolte o solutie informatica, iar sumele nu erau neglijabile. Studiul problemei a aratat ca : - serverul sistemului era un Linux - limbajul de progaramare al unora din componentele tehnice era similar cu Oberonul.

Contractul era sa fie ratat.

Coincidentele cu situatii reale sunt sau nu intamplatoare dupa cum situatiile reale seamana sau nu cu cea descrisa si au inspirat sau nu descrirea de mai sus.

Fara comentarii.

In cate stiluri se poate programa in Haskell ?

In foarte multe stiluri:
  • Daca ati programat in C veti gasi familiara do-notatia si veti putea programa in mod imperativ in ea.
  • Functiile se pot scrie si ca operatori, operatorii se pot scrie si ca functii,

exista liste, deci puteti programa in stilul din Lisp sau Scheme, daca bineinteles va convine sa numarati parantezele.

  • Inferentele pe care le face sistemul de deductie a tipurilor pot fi gandite ca niste implicatii si se poate programa in Haskell intr-un stil a la Prolog.
  • Exista niste recorduri cu campuri neanonime, care pot contine si functii pe post de date. Mai exista si niste clase (e drept clase de structuri algebrice) si cu instantele lor. Programatorii in limbaje POO ar tebui sa stie ca se afirma ca Haskell este in mai mare masura POO ca Python, de exemplu.
  • Se poate lucra in stil Generic Programming. Vedeti lucrarile din seria "Scrap your Boilerplate" ale lui Simon P.J
  • La urma urmei orice limbaj se poate include total sau partial in Haskell deoarece Haskell este un limbaj bun pentru scrierea de limbaje. Acest lucru a dat nastere unui stil aparte numit: Interpretive Programming.
  • Folosirea functiilor de ordin superior (printre care map si fold-urile dar si functii utilizator ) poate ea insasi sa genereze un stil de programare.
  • La urma dar pe departe cel dintai: Stilul Monadic Programming, o paradigma, un stil nou, in care se separa cumva descrierea succesiunii de calcule de crearea calculelor si inlantuirea lor.

Cateva exemple despre felul cum se poate programa in diverse stiluri gasiti la pagina web:

Evolution of a Haskell Programmer. (by F.Ruehr)

Vedeti si CPS adica Continuation passing style atat in romana cat si in engleza. Sunt pagini distincte.

Cum gasim harta site-ului ?

Pentru a gasi harta site-ului cautati: Category:Ro folosind motorul de cautare din partea dreapta sus a paginilor. Apoi dati click pe Go sau Search!

Se poate scrie un nume de functie cu diacritice ?

In unele situatii, da. De exemplu, daca folositi GHC - The Glasgow Haskell Compiler sau GHCI - GHC Interactiv, puteti rula un program ca acesta:
module Jumătate where

jumătate 			:: (Fractional a) => a -> a
jumătate x			= x * 0.5

Si obtineti asa ceva (aici pe Ubuntu 10.10 + GHC6):

danu@computer:~/Desktop$ ghci a.hs
GHCi, version 6.12.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling Jumătate         ( a.hs, interpreted )
Ok, modules loaded: Jumătate.
*Jumătate> 
*Jumătate> jumătate 10
5.0
*Jumătate>

Dar interpretorul Hugs pe care l-am folosit nu a permis asa ceva.

Se poate scrie un nume de fisier cu diacritice ?

Nu va recomandăm. Riscă să nu poata fi incărcat de compilator.

Desi un program poate să manipuleze literele romanesti, să le folosească in denumiri de functii, totusi NU recomandăm să scrieti in limba romană numele de fisiere.

Un fisier:

module Jumătate where

jumătate 			:: (Fractional a) => a -> a
jumătate x			= x * 0.5

Ar putea fi compilat de compilatorul GHC sau executat interactiv de GHCI (nu, cu HUGS nu merge !)

Dar nu-l denumiti: ă.hs fiindcă vă poate face probleme la compilare sau incărcare.

Ruleaza pe sisteme multicore ?

Haskell ruleaza pe sistemele multicore !

GHC Haskell vine impreuna cu biblioteci si optiuni de compilare care permit compilarea pt sisteme Multicore: multicore architectures.

Introducere

Ca sa aveti o idee cum s-ar putea reduce timpul de calcul olosind mai multe nuclee hack-uiti programul de mai jos: un program carre calculeaza termenii sirului lui Fibonacci, pina la un loc secvential apoi paralel.

import Control.Parallel
import Control.Monad
import Text.Printf

cutoff = 35                       -- nivelul de la care comutam pe SMP

fib' :: Int -> Integer
fib' 0 = 0
fib' 1 = 1
fib' n = fib' (n-1) + fib' (n-2)

fib :: Int -> Integer             -- paralelism explicit
fib n | n < cutoff = fib' n
      | otherwise  = r `par` (l `pseq` l + r)
 where
    l = fib (n-1)
    r = fib (n-2)

main = forM_ [0..45] $ \i ->
            printf "n=%d => %d\n" i (fib i)

Trebuie neaparat compilat cu optiunea `-threaded`:

   $ ghc -O2 -threaded --make fib.hs
   [1 of 1] Compiling Main             ( fib.hs, fib.o )
   Linking fib ...

Si rulat cu optiunile:

   +RTS -Nx

unde 'x' unde x de dupa N este numarul de nuclee disponibile. De exemplu, pe un sistem Linux cu procesor quad core :

   ./fib +RTS -N4  


Exemples

De citit

Primitivele pt lucrul cu thread-uri

Control.Concurrent Control.Concurrent

Continuarea

Pe pagina originala, in limba engleza: Haskell_for_multicores de unde este luat si tradus textul de mai sus.


BannerProLinuxAndHaskell.gif

La facultate poti invata unul din cele mai productive limbaje: Haskell.