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

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值