Institute of Computer Science
  1. Courses
  2. 2020/21 fall
  3. Programming Languages (MTAT.03.006)
ET
Log in

Programming Languages 2020/21 fall

  • Info
  • Õppekava
  • Moodle
  • Loengud & Praksid
  • Lisamaterjalid
  • Küsi abi! (Fleep)

1. Haskelli praktikum

Kõige "madalam" tase Haskellis on puhaste funktsioonide kirjutamine. Oskus kirjutada puhtaid rekursiivseid funktsioone on Haskelli alus --- teoorias polegi midagi rohkemat vaja. Selles praktikumis harjutame rekursiivseid funktsioone täisarvudel.

Lahendamiseks loo näiteks fail Yl1.hs sellise sisuga:

module Yl1 where

-- kirjuta funktsioonid siia

Katsetamiseks ja testimiseks käivita käsurealt GHCi loodud failiga samas kaustas: stack ghci Yl1.hs. GHCi-s saad käivitada failis defineeritud funktsioone Haskelli süntaksiga, nt sumInt 10. Kui muudad ja salvestad faili, siis võid avatud GHCi-s anda spetsiaalse käsu :r, et fail uuesti laadida, ilma et peaks iga muudatuse järel GHCi-d sulgema ja taasavama.

Näiteülesanded

sumInt

Kirjuta funktsioon sumInt, mis saades sisendiks naturaalarvu x tagastab x-st väiksemate või võrdsete arvude summa.

{$ \textsf{sumInt}(x) = \begin{cases} 0 & \text{kui }x = 0 \\ \textsf{sumInt}(x-1)+ x & \text{muidu } \end{cases} $}

sumInt :: Int -> Int
sumInt n = undefined

Redutseeri avaldis sumInt 3.

fib

Kirjuta funktsioon fib, mis leiab n-da Fibonacci arvu.

{$ \textsf{fib}(x) = \begin{cases} 0 & \text{kui }x = 0\\ 1 & \text{kui }x = 1\\ \textsf{fib}(x-1) + \textsf{fib}(x-2) & \text{muidu } \end{cases} $}

fib :: Int -> Int
fib n = undefined

Redutseeri avaldis fib 3.

modulo

Kirjutada jäägiga jagamise funktsioon modulo.

{$ \begin{align*} \textsf{modulo}(x,y) =&{}\; f(x)
&{} \text{kus} \quad f(n) = \begin{cases} n & \text{kui }n < y\\ f(n-y)& \text{muidu} \end{cases} \end{align*} $}

modulo :: Int -> Int -> Int
modulo x y = undefined

Redutseeri avaldis modulo 5 2.

Harjutusülesanded

Ülesanne 1

Kirjuta funktsioon syt, mis leiab suurima ühisteguri läbi Eukleidese algoritmi.

{$ \textsf{syt}(x,y) = \begin{cases} x & \text{kui }y = 0 \\ \textsf{syt}(y,\textsf{mod}\;x\;y) & \text{muidu } \end{cases}
$}

kus mod on Haskelli jagamise jäägi operaator (või eelnevalt defineeritud modulo)

syt :: Int -> Int -> Int
syt x y = undefined

Redutseeri avaldis syt 12 8.

Ülesanne 2

Kirjutada McCarthy ??-funktsioon, kus ?? asemel on üks arv. Testida funktsiooni sisenditega 0-i ja 100 vahel. Mis arv see on?

{$ \textsf{mc}(x) = \begin{cases} x-10 & \text{kui }x > 100\\ \textsf{mc}(\textsf{mc}(x+11)) & \text{muidu } \end{cases} $}

mc :: Int -> Int
mc n = undefined

Ülesanne 3

Kirjutada Hanoi funktsioon.

{$ \textsf{hanoi}(n) = \begin{cases} 1 & \text{kui }n = 1\\ 2*\textsf{hanoi}(n-1)+1 & \text{kui }n > 1 \\ \end{cases} $}

hanoi :: Int -> Int
hanoi n = undefined

Ülesanne 4

Kirjutada Ackermanni funktsioon.

{$ A(m,n) = \begin{cases} n+1 & \text{kui }m = 0\\ A(m-1,1) & \text{kui }m > 0 \text{ ja } n = 0\\ A(m-1,A(m,n-1)) & \text{muidu } \end{cases} $}

ack :: Int -> Int -> Int
ack m n = undefined

Ülesanne 5

Kirjutage Programmeerimiskeelte kursuse hinde arvutamise funktsioon, nii et hinne hb sb kodu loeng eks arvutaks välja hinde tähena (A, B, ..., F),

  • `hb' on tõeväärtus, kas Haskelli baastest on läbitud
  • `sb' on tõeväärtus, kas Scala baastest on läbitud
  • `kodu' on kodutööde punktid
  • `loeng' on loengutestide punktid
  • `eks' on eksami punktid
hinne :: Bool -> Bool -> Int -> Int -> Int -> Char
hinne = undefined

Ülesanded*

Olgu antud sellised definitsioonid:

korda :: Int -> (Int -> Int) -> Int -> Int
korda 0 f x = x
korda n f x = f (korda (n - 1) f x)

inc :: Int -> Int
inc x = x + 1

Kirjutada liitmise funktsioon add, mis kasutavb ainult oma argumente ning funktsioone inc ja korda.

add :: Int -> Int -> Int
add x y = undefined

Kirjutada korrutamise funktsioon mul, mis kasutavb ainult oma argumente, konstanti 0 ning funktsioone add ja korda.

mul :: Int -> Int -> Int
mul x y = undefined

Lahendada ülesanded 2 ja 3 kasutades püsipunktioperaatorit fixedPt f = g where g = f g

hanoi' :: Int -> Int 
hanoi' = fixedPt h
  where h = undefined
        fixedPt f = g where g = f g

mc' :: Int -> Int 
mc' = fixedPt h
  where h = undefined
        fixedPt f = g where g = f g

{$ $}

  • Institute of Computer Science
  • Faculty of Science and Technology
  • University of Tartu
In case of technical problems or questions write to:

Contact the course organizers with the organizational and course content questions.
The proprietary copyrights of educational materials belong to the University of Tartu. The use of educational materials is permitted for the purposes and under the conditions provided for in the copyright law for the free use of a work. When using educational materials, the user is obligated to give credit to the author of the educational materials.
The use of educational materials for other purposes is allowed only with the prior written consent of the University of Tartu.
Terms of use for the Courses environment