Származtatott típusok

Származtatott típusok

A newtype kulcsszóval egy új típust hozhatunk létre korábbi típusokból.

newtype Name = N String

Megadunk:

Az N konstruktor tesz különbséget a Name és a String típus között.

A konstruktor használata

Példa N használatára kifejezésben:

x :: Name
x = N "asztal"

Példa N használatára mintában:

properName :: Name -> Bool
properName (N s) = isUpper (head s)

Műveletek automatikus hozzáadása

Az új típus annyira új, hogy még egyenlőségvizsgálat sincs rá.

A deriving kulcsszóval különböző műveletek automatikus definícióját kérhetjük:

-- newtype Name = N String
--    deriving (Eq, Ord, Show)

Feladat: Évek [*]

Definiáljuk a Year típust mint egész számot!


Test>

Feladat: Sakktábla mezők

Definiáljuk a sakktábla mezőit mint karakter + egész párokat!


Test>

Feladat: Ügyes konstruktor [*]

Definiáljunk egy s függvényt, ami ellenőrzötten készít el egy mezőt!

s :: (Char, Int) -> Square

Test>
True :: Bool

Feladat: Egész koordinátájú pontok


Test>
P (0, 0) :: IPoint

Feladat: Origóra tükrözés

mirrorO :: IPoint -> IPoint

Test>
True :: Bool

Feladat: Pontra tükrözés

mirrorP :: IPoint -> IPoint -> IPoint

Test>
True :: Bool

Feladat: Eltolás

translate :: (Int, Int) -> IPoint -> IPoint

Test>
True :: Bool

type és newtype

Példa:

type A = String
newtype B = X String

Különbségek A és B között:

type és newtype a felhasználás terén

A type használata a kód olvashatóságát növeli, bevezetésekor csak a típusokat kell módosítani.

A newtype használata a kód olvashatóságát és megbízhatóságát is növeli, bevezetésekor a típusokat is módosítani kell és a definíciókat konvertálásokkal kell kiegészíteni.