Cum este atribuirea in Haskell ?

From HaskellWiki
Haskell - Un limbaj functional pur
Haskell - Un limbaj functional pur

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).


Haskell nu foloseste atribuiri in sensul comun al termenului.

Astfel se elimina o sursa importanta de erori, (re)atribuirea de valori incorecte variabilelor !

Dar daca totusi ordinea calculelor conteaza - cum ati invatat in vechile limbaje - puteti programa in do-notatie, cu ceva chiar mai tare decat atribuirile, dar care arata ca niste atribuiri, cam asa:

-- Acest exemplu este de corectat
import Data.Char 

main = do { c <- getChar ;
            b <- ord c ;      
            a <- 1 ;
            print (a+b);
            return 0 }

Corectura: Intregii 1 si ord c treceti-i prin functia return. Va spun alta data de ce.,.

Programul corect arata asa:

import Data.Char 

main = do { c <- getChar ;
            b <- return (ord c) ;
            a <- return 1 ;
            print (a+b);
            return 0 }

Puteti citi cele trei "atribuiri"(de fapt se numesc generatori), astfel:

c ia valoarea rezultata din actiunea "getChar"

b ia valoarea rezultata din actiunea "return (ord c)"

a ia valoarea rezultata din actiunea "return 1"

Iar daca nu va place sa scrieti return de fiecare data puteti folosi alt nume pentru el, de exemplu val, sau v de la valoare.

import Data.Char 

main = do { c <- getChar ;
            b <- val (ord c) ;
            a <- val 1 ;
            print (a+b);
            return 0 }
       where val = return

. Asa ruleaza programul

Main> main
a
98

Main>


. Cauza nefunctionarii primului exemplu

Ca idee, mica incurcatura este din pricina tipurilor:

ERROR "atribuire.hs":3 - Type error in generator
*** Term           : ord c
*** Type           : Int
*** Does not match : IO a

Data.Char> :r
ERROR "atribuire.hs":3 - Type error in generator
*** Term           : ord c
*** Type           : Int
*** Does not match : IO a

Data.Char> :t getChar
getChar :: IO Char

Data.Char> :t ord b
ERROR - Undefined variable "b"

Data.Char> :t ord 'c'
ord 'c' :: Int

Data.Char> :t print 10
print 10 :: Num a => IO ()

La adunarea finala nu pot participa asemenea 'valori' din aceste tipuri diferite.

Dezavantajul folosirii acestui stil de programare

Programelke Haskell pur functionale, fara do-uri, compuse numai din functii beneficiaza de o ordine de evaluare dinamic optimizatra, la cererea programului. Asa ca mai bine scrieti cat mai multe functii fara do-notatie si un mic program main ca mai sus care o foloseste pe do-notatie si le foloseste si pe functiile utilizator.