, , , , , , .
, , , , , , . . , , , .
, :
, main. " " GC , main, , .
foo = "Hi!"
main = print "Bye!"
foo main, , , main, .
, :
foo = "Hi!"
bar = "Bye!"
main = print foo >> print bar
foo main, . main , , ,
(primitive operation that prints out "Hi!") >> print bar
, foo , !
, "!", " "
print bar
WHNF , ,
(primitive operation to print "Bye!")
bar . " !" .
:
main = do
let ls = [0..10000000]
print ls
main =
let ls = [0..10000000]
in print ls
. " " - , in . ls print . , print, [Integer], ( -, ).
print xs = case xs of
[] -> return ()
(y:ys) = printInteger y >> print ys
, main ( ? ?), print ls. ls, ls WHNF. y:ys, , print ls print Integer y >> print ys, y ls ys thunk, ls. , ls ! ! print , , , .
,
main =
let ls = ...
in print ls >> print ls
, (print ls).
(printInteger y >> print ys) >> print ls
, , ls. , , , , .
- , IO. , [Int], - .
countup m n = if m == n then [] else m : countup (m+1)
main = countup 0 1000
, , . " " whatPrint. :
whatPrint main.whatPrint ? , . , , printNow : whatPrint'.printNow .whatPrint whatPrint'- 1.
" " - whatPrint.
; IO. (). >>=, return IO IO.
data IO :: * -> * where
Return :: a -> IO a
Bind :: IO a -> (a -> IO b) -> IO b
PrintInt :: Int -> IO ()
ReadInt :: IO Int
...
whatShouldIDo main, . , , . .