I/O Action
I/O Action是一种Monad,通常使用do语法。 使用<-从I/O Action中取出值,使用return将值封装进I/O Action。 在I/O Action中使用let语句不用带in。 在I/O Action中使用if-then-else语句注意两个分支都必须是I/O Action。 import Data.Char
main = do
putStrLn "Hello, what's your name?"
name <- getLine
let bigName = map toUpper name
putStrLn ("Hey " ++ bigName ++ ", how are you?")
*Main> main
Hello, what's your name?
Mike
Hey MIKE, how are you?
I/O 函数
putStr:输出字符串 putStrLn:输出字符串,并且换行 putChar:输出字符 print:相当于putStrLn . show,ghci对话环境下所缺省执行的命令。 getLine:输入一行字符串 getChar:输入一个字符
IO 是 Functor 也是 Applicative
Prelude> fmap (replicate 2) getLine
abc
["abc","abc"]
Prelude> (++) <$> getLine <*> getLine
abc
abc
"abcabc"
随机函数
mkStdGen:返回随机生成器 random, randoms:返回一个以及无限多个随机数(列表) randomR, randomRs:返回某个区域内的一个以及无限多个随机数(列表) getStdGen:返回系统全局的随机生成器 newStdGen:重置并返回系统全局的随机生成器 randomIO:返回一个随机数(使用全局随机生成器) randomRIO:返回某个区域内的一个随机数(使用全局随机生成器)
Prelude System.Random> random (mkStdGen 100) :: (Int, StdGen)
(-3633736515773289454,693699796 2103410263)
Prelude System.Random> random (mkStdGen 100) :: (Int, StdGen)
(-3633736515773289454,693699796 2103410263)
Prelude System.Random> random (mkStdGen 200) :: (Int, StdGen)
(-7150216019525618111,41011827 2103410263)
Prelude System.Random> random (mkStdGen 100) :: (Bool, StdGen)
(True,4041414 40692)
Prelude System.Random> random (mkStdGen 100) :: (Double, StdGen)
(0.5742054767300735,693699796 2103410263)
Prelude System.Random> take 5 $ randoms (mkStdGen 100) :: [Int]
[-3633736515773289454,-1610541887407225575,4434840125058622350,1116419036860971948,1434273519690261584]
Prelude System.Random> take 5 $ randoms (mkStdGen 100) :: [Bool]
[True,False,False,False,False]
Prelude System.Random> take 5 $ randoms (mkStdGen 100) :: [Double]
0.5742054767300735,0.1939314477241708,0.36616173715911926,0.9474119852892406,0.23634851702912307]
Prelude System.Random> randomR (1,10) (mkStdGen 100)
(2,4041414 40692)
Prelude System.Random> take 10 $ randomRs ('a','z') (mkStdGen 100) :: [Char]
"xkgmijbcqd"
Prelude System.Random> do { gen <- getStdGen; return $ randomR (1,10) gen }
(5,886796697 40692)
Prelude System.Random> do { gen <- getStdGen; return $ randomR (1,10) gen }
(5,886796697 40692)
Prelude System.Random> do { gen <- newStdGen; return $ randomR (1,10) gen }
(4,1412122309 2147442707)
Prelude System.Random> do { newStdGen; gen <- getStdGen; return $ randomR (1,10) gen }
(4,886876725 2103410263)
Prelude System.Random> do { newStdGen; gen <- getStdGen; return $ randomR (1,10) gen }
(9,886916739 1872071452)
Prelude System.Random> randomIO
7275033611255646048
Prelude System.Random> randomRIO (1, 10)
8