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
相关文章推荐
- Haskell语言学习笔记(20)IORef, STRef
- Haskell语言学习笔记(19)File IO
- Haskell语言学习笔记(3)map, filter, fold
- Haskell语言学习笔记(9)State Monad
- Haskell语言学习笔记(22)MaybeT
- Haskell语言学习笔记(30)MonadCont, Cont, ContT
- Haskell语言学习笔记(26)Identity, IdentityT
- Haskell语言学习笔记(28)Data.Map
- Haskell语言学习笔记(4)Functor
- Haskell语言学习笔记(17)MonadPlus
- Haskell语言学习笔记(23)MonadReader, Reader, ReaderT
- Haskell语言学习笔记(6)Monad
- Haskell语言学习笔记(15)Data.List
- Haskell语言学习笔记(11)Point-Free
- Haskell语言学习笔记(24)MonadWriter, Writer, WriterT
- 32位汇编语言学习笔记(43)-- 生成随机数
- Haskell语言学习笔记(8)Monoid
- Haskell语言学习笔记(13)Monadic Functions
- Haskell语言学习笔记(14)Foldable
- Haskell语言学习笔记(27)Endo, Dual, Foldable