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

Functional Programming 2025/26 fall

  • Üldinfo
    • Õppekorraldus
  • Kursus
    • KKK
    • Installimine
    • Kodutöö 1
    • Kodutöö 2
    • Kodutöö 3
    • Kodutöö 4
    • Kodutöö 5
    • Kodutöö 6
    • Kodutöö 7
    • Kodutöö 8
    • Suur kodutöö 1
    • Kodutöö 9
    • Kodutöö 10
    • Kodutöö 11
    • Kodutöö 12
    • Suur kodutöö 2
    • Kodutöö 13*
    • Kodutöö 14*
  • FP Õpik
  • Moodle
  • Zulip (sisselogides näed linki)

IO (sisend-väljund)

Idrise puhtad funktsioonid ei võimalda teha mittepuhtaid arvutusi. Aga, mittepuhtaid arvutusi saab modelleerida Idrise funktsioonide ja tüüpide abil.

Näiteks tüüp IO a. Intuitsioon: „masin mis arvutab a tüüpi väärtuse“

  • pure : a -> IO a --- masin tagastab esimese argumendi väärtuse
  • (>>=) : IO a -> (a -> IO b) -> IO b --- masin käivitab esimese argumendi ja rakendab tulemuse teisele

Lisaks baasfunktsioonid:

  • putStrLn : String -> IO () --- prindib sõne ning uue rea
  • putStr : String -> IO () --- prindib sõne ilma uue reata
  • getLine : IO String --- loeb rea sisse
  • printLn : a -> IO () --- prindib tüübi a (eeldusel, et tüübil a on impl. Show liides) ning uue rea
  • print : a -> IO () --- prindib tüübi a (eeldusel, et tüübil a on impl. Show liides) ilma uue reata

Nii saab kombineerida olemasolevaid IO „masinaid“. Näiteks:

main : IO ()
main = randomRIO (1, 10) >>= classify >>= putStrLn
    where classify : Int -> IO String
          classify x = if x `mod` 2 == 1 then 
                          pure "paaritu"
                       else 
                          pure "paaris"

REPL-is saab modelleeritud programmi käima panna nii:

    :exec main

do-süntaks

Eelnevat koodi on keeruline lugeda ja kirjutada. Sama saab saavutada järgnevalt

main : IO ()
main = do
    r <- randomRIO (1, 10)
    c <- classify r
    putStrLn c
    where classify : Int -> IO String
          classify x = ...

või

main : IO ()
main = do
    r <- randomRIO (1, 10)
    if x `mod` 2 == 1 
      then putStrLn "paaritu"
      else putStrLn "paaris"

Do-süntaks algab do-võtmesõnaga, millele järgnevad järjest töödeldavad laused.

  • Laused mustriga x <-p, kus p : IO a siis peale seda lauset x : a
  • let laused ning,
  • avaldised e, mille tüüp on IO a.

Pane tähele: do seob kokku IO-avaldised, kuid ei saa vaadata konstruktsioonide sisse

  • ühe avaldise jaoks pole do-d vaja
    • main = putStrLn "Hello World!"
  • Hargenmise puhul võib olla vaja kasutada mitut do-d:
main : IO ()
main = do
    putStrLn "Kirjuta midagi!"
    xs <- getLine
    if (xs=="")
      then putStr "Sõnakuulmatu!"
      else do
        putStrLn "Tänan!"
        putStrLn ("Kirjutasid: " ++ xs)
do tähendus

a >>= f on sama mis

  do x <- a
     f x

a >> b on sama mis

  do a
     b
  do a                 do do a                   do a
     b   on sama mis         b    on sama mis       do b
     c                    c                            c

Fixity:

  infixl 1 >>
  infixl 1 >>=

Näide:

main : IO ()
main = do
  putStrLn "Kirjuta midagi!"
  xs <- getLine
  if (xs=="")
    then putStr "Sõnakuulmatu!"
    else do
      putStrLn "Tänan!"
      putStrLn ("Kirjutasid: " ++ xs)

on sama mis

main : IO ()
main =
  putStrLn "Kirjuta midagi!" >>
  getLine  >>= (\ xs =>
  if (xs=="")
    then putStr "Sõnakuulmatu!"
    else
      putStrLn "Tänan!" >>
      putStrLn ("Kirjutasid: " ++ xs)
  )

on sama mis

main : IO ()
main = do
  let ifTE : String -> IO () 
      ifTE xs = 
        if (xs=="") 
            then putStr "Sõnakuulmatu!" 
            else  putStrLn "Tänan!" >> putStrLn ("Kirjutasid: "++xs)
  putStrLn "Kirjuta midagi!" >>  getLine  >>= ifTE
  • 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