I/O операции в Хаскел
YouTube - Simon Peyton-Jones: Escape from the ivory tower: the Haskell journey
Материал
- Сложете си haskell-linter ако пишете на VSCode
Какво правихме предния път
- модули - начин да си структорираме кода във файлове
- импортиране на модули
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 anI/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
По-детайлно може да разгледате тук
Задачи
- TODO: (T_T)