Institute of Computer Science
  1. Courses
  2. 2023/24 fall
  3. Functional Programming (LTAT.03.019)
ET
Log in

Functional Programming 2023/24 fall

  • Üldinfo
    • Õppekorraldus
  • Loeng
    • Baasväärtused ja tüübid
    • 𝜆-arvutus
    • Kõrgemat järku funktsioonid
    • Interaktiivne programmeerimine
    • Uute tüüpide loomine
    • Liidesed
    • Sisend-Väljund
    • Laiskus
    • Lihtsalt tüübitud 𝜆-arvutus
    • Tüübituletus
    • Sõltuvad tüübid
    • Tõestamine Idrises
    • Kvantitatiivne tüübiteooria
  • Praktikum
    • KKK
    • Installimine
    • Kodutöö 1
    • Kodutöö 2
    • Kodutöö 3
    • Kodutöö 4
    • Kodutöö 5
    • Kodutöö 6
    • Kodutöö 7
    • Kodutöö 8
    • Kodutöö 9
    • Kodutöö 10
    • Kodutöö 11
    • Kodutöö 12
    • Kordamine
    • Projektid
  • Moodle
  • Zulip (sisselogides näed linki)

Kodutöö 7

Do-notatsioon ja Sisend-väljund

Selles praktikumis õpime kasutama sisendit-väljundit.

Konspekt (Sisend-Väljund)

Lisalugemine (vabatahtlik):

Type-Driven development with Idris peatükid:

  • Chapter 1. Overview, alampeatükk:
    • 1.3.2. Side-effecting programs
  • Chapter 5. Interactive programs: input and output processing, sissejuhatus ja alampeatükid:
    • 5.1. Interactive programming with IO
      • 5.1.1. Evaluating and executing interactive programs
      • 5.1.2. Actions and sequencing: the >>= operator
      • 5.1.3. Syntactic sugar for sequencing with do notation
    • 5.2. Interactive programs and control flow
      • 5.2.1. Producing pure values in interactive definitions

Praktikumi ja kodutöö ülesanded

1. Protseduur t2ring

Kirjuta protseduur t2ring, mis trükib konsooli juhusliku arvu ühest kuueni. Soovitatav on kasutada mooduli System.Random funktsiooni randomRIO mille tüüp on lihtsustatult Random a => (a, a) -> IO a.

t2ring : IO ()
t2ring = ?rhs_t2ring

NB! Miskipärast on Idrises Random defineeritud vaid Int32 täisarvutüübi jaoks. (vihje: the)

REPLis do-notatsiooni kasutava funktsiooni jooksutamiseks kirjuta funktsiooni kutse ette :exec

2. Protseduur dialoog

Kirjuta protseduur dialoog, mis küsib kasutajalt nime ja tervitab teda sellega.

dialoog : IO ()
dialoog = ?rhs_dialoog

3. Listi trükk

Kirjuta funktsioon, mis prindib talle argumendina antud arvude listi. Iga prinditav arv peab tulema eraldi reale. Näiteks:

> prindiArvud [1,66,99]
1
66
99
prindiArvud : List Int32 -> IO ()
prindiArvud xs = ?rhs_prindiArvud

4. Arvude sisetamine

Kirjuta protseduur, mis esmalt küsib kasutajalt arvu. Kui kasutaja sisestab mittearvu, tuleb veast teatada ning uuesti arvu küsida. Protseduur tagastab edukalt sisestatud arvu.

readMaybe : IO (Maybe Int32)
readMaybe = do
  input <- getLine
  if all isDigit (unpack input)
    then pure (Just (cast input))
    else pure Nothing

loeArv : IO Int32
loeArv = ?rhs_loeArv

5. Kahe arvu summa

Kirjuta protseduur, mis küsib kasutajalt kaks arvu ning trükib nende summa.

summa2 : IO ()
summa2 = ?rhs_summa2

6. Arvude summa

Kirjuta protseduur, mis esmalt küsib arvu n, seejärel loeb n arvu ning lõpuks trükib viimati loetud n arvu summa. Proovige lahendada seda lihtrekursiooniga kui ka kasutades näiteks sequence funktsiooni.

Lihtsustatult, võtab sequence : List (IO a) -> IO (List a) listi arvutusi ja teeb need järjest ning tagastab listi tulemustega. Sarnaselt töötab ka traverse : (a -> IO b) -> List a -> IO (List b).

summaN1 : IO ()
summaN1 = ?rhs_summaN1

summaN2 : IO ()
summaN2 = ?rhs_summaN2

7. Arvu arvamise mäng

Implementeeri klassikaline mäng, mis valib juhusliku arvu nullist sajani ning kasutaja peab selle ära arvama. Kasutaja saab pakkuda arve ja programm ütleb, kas pakutud arv on suurem, võrdne või väiksem. Kui vastus on võrdne (s.t. pakutud arv on võrdne juhuslikult valitud arvuga) on mäng läbi ja trükitakse pakkumiste arv.

> :exec m2ng
Arva ära täisarv vahemikus nullist sajani!
Sisesta number: 50
Ei! Minu number on suurem
Sisesta number: 62
Ei! Minu number on väiksem
Sisesta number: 61
Ära arvasid! Oligi 61. Pakkusid 3 korda.
m2ng : IO ()
m2ng = ?rhs_m2ng

Tärnülesanded

m2ngR

Implementeeri arvu äraarvamise mängu pöördversioon, kus kasutaja valib mõttes (juhusliku) arvu ja programm püüab seda ära arvata. Programm peaks ära tundma sohitegemise, kui kasutaja on vastanud enesele vasturääkivalt.

m2ngR : IO ()
m2ngR = ?rhs_m2ngR

Kontrolltööks valmistumine

Näidiskontrolltöö siin

  • 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