您的位置:首页 > 其它

Haskell语言学习笔记(7)IO 与随机数

2017-02-03 09:08 489 查看

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: