Kihagyás

9. gyakorlat

Típus szinonímák

A típusokra definiálhatunk szinonímákat.

Példa:

-- person1

person1 :: (String, String, String, Int)
person1 = ("F.Kány", "ELTE déli tömb","fkany@inf.elte.hu",1 )


-- person2

type Name = String
type Address = String
type Email = String
type Age = Int

person2 :: (Name, Address, Email, Age)
person2 = person1

-- A person1 és a person2 ugyanaz lesz

Másik példa:

type Predicate a = a -> Bool

break' :: Predicate a -> [a] -> ([a], [a])
break' p = span (not . p)

Saját típusok

Haskellben egy típus neve mindenképpen nagybetűvel kell, hogy kezdődjön

Bool típus

"Így" van definiálva a Bool

data Bool = False | True

Answer típus

  • Az Answer egy saját típus
  • Definiáljuk a 3 lehetséges értékét => ezek konstruktorok (ld. a végén)
data Answer = No | Perhaps | Yes

λ :t No
No :: Answer

λ :t Yes
Yes :: Answer

Definiálunk egy függvényt az Answer típussal

neg :: Answer -> Answer
neg No      = Yes
neg Perhaps = Perhaps
neg Yes     = No
λ neg Yes
No instance for (Show Answer) arising from a use of print

Nem tudja megjeleníteni, mert szükség van a Show típusosztályra => deriving

deriving

  • Automatikusan implementálja a típusosztályt
  • Megjegyzés: A deriving 7 típusosztályt tud:
    • Show
    • Read
    • Eq
    • Ord
    • Enum
    • Bounded
-- Derive -> automatikusan implementálja a típusosztályt
λ data Answer = No | Perhaps | Yes deriving Show
λ neg Yes
No

instance

Manuálisan implementálva => instance

Show típusosztály

-- instance -> manuálisan implementálható a típusosztály
instance Show Answer where
    -- show :: a -> String
    show No = "No"
    show Perhaps = "Perhaps"
    -- show Perhaps = "Perchance" -- ha így írnánk, akkor `Perchance`-ként használnánk (így fordulna le String-re, ami megjelenik)
    show Yes = "Yes"

Eq típusosztály

instance Eq Answer where
    (==) Yes     Yes     = True
    (==) No      No      = True
    (==) Perhaps Perhaps = True
    (==) _       _       = False

Cliffhanger (Kövi órán innen folytatjuk)

data Complex = C Integer Integer

Konstruktorok

  • A Complex-nél a C egy konstruktor
  • Az Answer-nél a Yes, a Perhaps és a No is konstruktorok
  • Létrehozza az adott típusnak egy elemét / értékét
  • Konstruktorokra lehet mintailleszteni
  • Definiálásnál | jelekkel választjuk el őket