A Haskell programozási nyelv

Absztrakt adattípusok

Absztrakt adattípust úgy definiálhatunk, hogy a típus specifikációt és a megvalósítást egyetlen modulban írjuk le. Minden modult önálló fájlban tárolunk, a fájl nevét úgy kapjuk, hogy a modul nevéhez a .hs kiterjesztést adjuk.

Az alábbi példa a verem definíciója:

module Stack( StkType, push, pop, empty ) where data StkType a = EmptyStk | Stk a (StkType a) push x s = Stk x s pop (Stk _ s) = s empty = EmptyStk

Mivel a modul fejlécében csak a három típusműveletet exportáltuk a típuson kívül (StkType), a típuskonstruktorok (EmptyStk, Stk) rejtve maradnak a modul külső felhasználói előtt. Így a modulon kívül vermet csak az empty típusműveleten keresztül lehet létrehozni.

Példa a használatra:

module StackExample where import Stack exp1 = pop (push 'a' empty) -- hibás -- exp2 = Stk 'a' EmptyStk

A láthatósági szabályok lehetővé teszik, hogy az implementációt bármikor kicseréljük a verem alatt. Például valósítsuk meg a vermet listával:

module Stack( StkType, push, pop, empty ) where newtype StkType a = Stk [a] push x (Stk s) = Stk (x:s) pop (Stk (x:s)) = Stk s empty = Stk []