A leggyakrabban használt Haskell értelmező a GHCi.
Ebben Haskell-kifejezéseket értékelhetünk ki vagy kifejezés típusát kérdezhetjük meg:
Alapesetben a Prelude
modulban található műveleteket használhatjuk, ezt jelzi az értelmező elindítása után a súgóban a Prelude>
(prompt).
A :set +t
parancs hatására a kifejezések kiértékelése után kiírja azok típusát is. :set +t
jelentése “set type on”.
Néhány számtípus:
Integer |
egész szám |
Int |
korlátos egész szám (-2147483648..2147483647) |
Rational |
racionális szám |
Double |
dupla pontosságú lebegőpontos szám |
A megadott Int
korlátok 32 bites gépen, GHC esetén igazak.
A Double
típus használata általában kerekítési hibákkal jár:
Egyéb számtípusok:
Ratio Integer |
(= Rational ) Két Integer hányadosa |
Ratio Int |
Két Int hányadosa |
Fixed E6 |
(= Micro ) Tizedestört 6 tizedesjeggyel |
Fixed E12 |
(= Pico ) Tizedestört 12 tizedesjeggyel |
Complex Float |
Komplex szám (Float pár) |
Complex Double |
Komplex szám (Double pár) |
Num a
jelentése: a
kicserélhető az Int
, Integer
, Rational
, Double
, … típusokra:
(+) :: Int -> Int -> Int
(+) :: Integer -> Integer -> Integer
(+) :: Rational -> Rational -> Rational
(+) :: Double -> Double -> Double
Num
egy típusosztály.
A Num
típusosztálynak van példánya az Int
típusra.
A típusokban a kisbetűs nevek típusváltozók. A típusváltozókat tartalmazó típusokat specializálhatjuk, azaz a típusváltozókat más típusokra cserélhetjük a megkötések szerint.
Az N paraméterű függvény típusa:
t1 ->
t2 ->
… ->
tN ->
tN+1.
Fractional a
jelentése: a
kicserélhető a Rational
, Double
, … típusokra.
Integral a
jelentése: a
kicserélhető az Int
, Integer
, … típusokra.
Körülbelül hány másodperc van egy évben?
Számítsuk ki az 1.01
sugarú gömb térfogatát!
Megjegyzés: pi
értéke π, a gömb térfogata 4r3π/3.
Döntsük el, hogy a 23
osztja-e a 532253373
-at!
Floating a
jelentése: a
kicserélhető a Double
, … típusokra.
Három féle hatványozás van aszerint, hogy a kitevő nemnegatív egész, egész vagy lebegőpontos szám.
Példa specializálásra:
Elméleti feladatok:
1 + 1.1
?3
típusa az (1 + 3) / 4
kifejezésben?Egy kifejezés típushelyes, ha kifejezések típusának specializálásával elérhetjük, hogy minden függvényargumentum típusa megegyezzen a függvény által kívánt típussal.
A típusspecializáció során a típusváltozókat tetszőleges típusra cserélhetjük:
a -> a
specializációi: Char -> Char
, [b] -> [b]
, …
A típusosztályok közt egy alosztály reláció van:
Ez lehetőséget biztosít egy másik fajta típusspecializációra. Például a Fractional a
tulajdonságból következik Num a
.
Ezért a típusspecializáció során Num
kicserélhető Fractional
-re:
specializált típusa
Az előbbi operátorok csoportosítása kötési erősség szerint:
^ , ^^ , ** |
irány: (.(.)) |
* , / |
irány: ((.).) |
+ , - |
irány: ((.).) |
Például 3 - 3 ^ 3 ^ 3 - 3
automatikus zárójelezése:
A kötési erősség értelmezése a szokásos: 1 + 2 * 4
helyes zárójelezése 1 + (2 * 4)
.
A balra és jobbra kötésnek akkor van jelentősége, ha azonos kötési erősségű operátorok kerülnek egymás mellé. 1/2/4
helyes zárójelezése (1/2)/4
, míg 3^3^3
helyes zárójelezése 3^(3^3)
.
Írjuk ki a rejtett zárójeleket!
A negálás az egyetlen prefix operátor. A negálás jele, kötési erőssége és kötése megegyezik a kivonáséval.
- 6 - 2
zárójelezése (- 6) - 2
,
- 6 ^ 2
zárójelezése - (6 ^ 2)
.
Hibás kifejezés:
Helyesen:
A következőképpen tudjuk megkülönböztetni a negálást a kivonástól: Ha a '-'
jel kifejezés után szerepel, akkor kivonást, egyébként negálást jelöl.
Negatív számliterál nincs, például a -13
kifejezés a 13
negáltja, ezért sokszor zárójellel kell védeni a negatív számokat.
A függvényalkalmazáskor nem kell zárójel és vessző:
Hibás kifejezés: sin cos 1
Helyesen:
A függvényalkalmazás minden operátornál erősebb:
sin pi + 1
zárójelezése (sin pi) + 1
.
A függvény és az operátor szintaktikus kategória. A függvénynevek betűkből állnak és kisbetűvel kezdődnek, az operátorok grafikus karakterekből állnak.
Grafikus karakterek a !?.#$%@&*+-~^/|\<=>
ASCII-karakterek és a nem ASCII-karakterek közül a szimbólumok.
A zárójelek kirakása megengedett, mivel tetszőleges kifejezés zárójelbe rakható, ha ez nem befolyásolja a műveleti sorrendet: sin(pi)
.
sin cos 1
azért hibás kifejezés, mert azt állítja hogy sin
egy két argumentumú függvény, amelynek átadjuk a cos
és 1
argumentumokat.
A kétparaméteres függvények is használhatók infix módon:
Az operátorok is használhatók prefix módon:
A függvényneveket `` jelek közé téve infix módon használhatjuk.
Az infix módon használt div
és mod
kötési erőssége és zárójelezése ugyanaz, mint a *
és /
operátoroké.
Az operátorneveket zárójelek közé téve prefix módon használhatjuk.
A prefix módon használt operátorok kötési erőssége a függvényalkalmazások erősségével egyezik meg (azaz a legerősebb).