Skip to content

Latest commit

 

History

History

week-06

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 

I/O операции в Хаскел

kidnapping your dog

YouTube - Simon Peyton-Jones: Escape from the ivory tower: the Haskell journey

Материал

Какво правихме предния път

  • модули - начин да си структорираме кода във файлове
  • импортиране на модули
    • import Data.List
    • import Data.List (nub, sort)
    • import Data.List hiding (nub)
    • import qualified Data.Map
    • import qualified Data.Map as M
  • имплементирахме Tic-Tac-Toe, но имаше лек проблем в имплементацията
    • не е добре да имаме различни record конструктори с различни пропъртита

Something cool out of context

Демонстрира lazyness и мемоизация

> x = 1 + 2 :: Int
> :sprint x
x = _
> x
3
> :sprint x
x = 3

:sprint ти показва стойност, без да я форсира

IO

30мин за IO като нещо което променя света - разгледай файла io.hs

SRC - [YouTube] What is IO monad? https://www.youtube.com/watch?v=fCoQb-zqYDI

Голяма част от примерите са любезно откраднати от - Learn You a Haskell for Great Good - Input and Output

  • Хакел е готин защото всичко е чисто, но как да въздействаме на света без да имаме възмоност да променяме състояние.

    it has to change the state of an output device (usually the state of the screen), which then emits photons that travel to our brain and change the state of our mind, man

  • IO е тип с който отделяме конуникацията със света от чистата природа на ф-иите в Хаскел.

  • Време е за hello world

    main = putStrLn "Hello World"

    We can read the type of putStrLn like this: putStrLn takes a string and returns an I/O action

  • IO действие е тип "кутийка", обикновено върши нещо мръсно (не чисто) и връща някакъв резултат в себе си (защото е "кутийка")

  • синтактична конструкция do - позволява ни да лепим последователност от IO действия (и не само, но за това по-нататък)

    Пример:

    main = do
        putStrLn "Hello, what's your name?"
        name <- getLine
        putStrLn ("Hey " ++ name ++ ", you rock!")
  • Залепили сме няколко IO-та в едно.

  • getLinst връща IO кутийка с резултат - <- ни позволява да отоврим кутийката и да вземем каквото има в нея (bind-ваме резултата)

  • можем да "бъркаме" в IO кутийка само когато сме в IO връщаща ф-я (за да не цапаме чистите си ф-ии с не чистото IO)

  • Това ще работи ли?

    nameTag = "Hello, my name is " ++ getLine

    Защо?

  • Mожем да байндваме и към putStrLn, но няма много смисъл

  • = /= <-

  • Можем да let-ваме в do (дори без in частта) - разгледай mainCalculator

  • runhaskell on the fly

  • return - не е каквото си мислите

    • не прекъсва изпълнението
    • какво прави тогава? - опакова стойност в IO
  • Пример за чейннат main без do

По-детайлно може да разгледате тук

Задачи

  1. TODO: (T_T)