Programhiba

A programhiba: ⊥

A ⊥ bármely típusú kifejezés lehetséges értéke:

Int értékek: , 0, 1, 2, …, -1, -2, …

Bool értékek: , True, False.

(Int,Char) értékek: , (⊥,⊥), (2,⊥), (1,'x'), …

Int -> Int értékek: , \x->⊥, \x->3, \x->x, …

A ⊥ jelentése


Vannak funkcionális nyelvek amelyekben nincs ⊥: Agda, Epigram. Ezekben a nyelvekben nincsenek parciális függvények és nem fordulhat elő nemterminálás!

A ⊥ mint programozói hiba

Végtelen kiértékelés:

x = x
f x = f x

Sikertelen mintaillesztés:

Test>

f x és x azonos ⊥-mal, de f maga nem.

Sikertelen mintaillesztésnek tekintjük a következő eseteket is: div 3 0.

A ⊥ szándékos előállítása

Kerülendő:

undefined :: a

Javasolt:

error :: [Char] -> a

Példa:

head (x:xs) = x
head []     = error "head of []"

Mire jó a ⊥ szándékos előállítása? Lehetetlen eset jelzésére használjuk. Ha már hibás a program, legalább legyen érthetőbb a hiba.

A ⊥ terjedése

Minden kifejezés, aminek a kiértékelése során mintaillesztés történik ⊥-ra, maga is ⊥:

-- ⊥ + 1 

A lustaság miatt nem minden ⊥ terjed tovább:

Test>

Mintaillesztés ⊥-ra?

⊥-ra nem lehet mintát illeszteni:

-- isBottom ⊥ = True   -- nem lehetséges!
-- isBottom _ = False

isBottom létezése több invariánst megsértene.

⊥ fajtái

A kiértékelés szempontjából csak egyféle ⊥ létezik.

A végrehajtás szempontjából többféle ⊥ létezik (ezek az úgynevezett kivételek, lásd később).

Minden ⊥-hoz tartozik egy hibaüzenet. Ha ⊥-ot írunk az értelmezőbe, akkor az értelmező kiírja a kapcsolódó hibaüzenetet:

Test>
⊥₁ :: Integer
⊥₁: divide by zero

A hibaüzenet nem determinisztikus, de ez nem is követelmény:

Test>
⊥₁ :: Integer
⊥₁: másik hiba
CallStack (from HasCallStack):
  error, called at <interactive>:3:15 in interactive:Ghci1