Haskell超初心者勉強会
11回
2013/7/29
Monday, July 29, 13
今日は「すごいHaskell」本
9章 もっと入力、もっと出力
•入力ストリームからの読み込み
•ファイルの読み書き
•コマンドライン引き数
•ランダム性
•bytestring
Monday, July 29, 13
入力ストリーム
•getContents :: IO String
•一度に全てを読み込まない。
メモリを食いつぶさない。
文字列(文字リスト)を遅延評価する。
import Data.Char
main = do
contents <- ge...
ファイルの読み込み
•hFoo は Handle を引数に取る関数
•hGetContents は stdin の代わりに
handle から読み込む
•遅延評価
import System.IO
main = do
handle <- ope...
ファイルの読み込み
withFile
•開いて、関数実行して、閉じる
•例外の場合でも確実に閉じる
import System.IO
main = do
withFile “baabaa.txt” ReadMode $ handle do
co...
Control.Exception の
bracket
•何かして、関数実行して、何かする
withFile’ :: FilePath -> IOMode -> (Handle ->
IO a)
withFile’ name mode f = ...
Control.Exception の
bracketOnError
•何かして、関数実行して、
例外のときだけ何かする
•例:一時ファイルを開いて、
処理する、
例外のときだけ一時ファイルを消す
Monday, July 29, 13
その他の h
•h じゃない版と同じ挙動
(handle を取る意外は)
hClose
hGetContents
hGetLine
hPutStr
hPutStrLn
hGetChar
Monday, July 29, 13
readFile
•readFile :: FilePath -> IO String
•開いて読んで閉じる
import System.IO
main = do
contents <- readFile “baabaa.txt”
putStr...
writeFile/appendFile
•readFile :: FilePath -> String -> IO ()
•開いて書いて閉じる
import System.IO
main = do
contents <- readFile “...
コマンドライン引数
•System.Environment の getArgs/
getProgName
import System.Environment
import Data.List
main = do
args <- getArgs
...
ランダム性
•System.Random モジュール
•RandomGen型クラス:
ランダム性の源として使える型
•Random型クラス:
ランダムな値として使える型
random :: (RandomGen g, Random a) => ...
乱数のテスト
•random はピュアな関数
•乱数を続けて発生させるときは
戻り値の RandomGen を次の乱数源
として使う
> random (mkStdGen 100) :: (Int, StdGen)
(-365087109068...
randoms
•ランダム値の無限リストを返す
•RandomGen は返さない
randoms :: (RandomGen g, Random a) => g -> [a]
Monday, July 29, 13
randomR
•ある範囲の乱数を返す
•(下限, 上限) -> (ジェネレータ) ->
(乱数, 新ジェネレータ)
randomR :: (RandomGen g, Random a) =>
(a, a) -> g -> (a, g)
Mon...
getStdGen
•グローバル乱数ジェネレータを返す
•プログラム実行毎に違う値
•1実行中は同じ値を返す
getStdGen :: IO StdGen
Monday, July 29, 13
newStdGen
•グローバル乱数ジェネレータを更新
•新しい乱数ジェネレータを返す
newStdGen :: IO StdGen
Monday, July 29, 13
thunk
•サンク(thunk)=遅延された計算
•リストの未評価の部分は thunk
•文字列(文字リスト)は thunk が
沢山なので遅い
Monday, July 29, 13
bytestring
•リストに似たデータ構造
•要素は 1 byteのサイズ固定
Monday, July 29, 13
正格 vs 遅延
• 正格 bytestring (Data.ByteString)
• thunk なし
• 最初のバイトを評価する時、全体を評価
• 遅延 bytestring (Data.ByteString.Lazy)
• 64KB c...
pack/unpack
•リストと相互変換
•Word8 は 8 bits unsigned int
pack :: [Word8] -> ByteString
unpack :: ByteString -> [Word8]
> import ...
fromChunks
•正格ByteStringのリスト ->
遅延ByteString
Monday, July 29, 13
bytestring モジュール
の関数
• Data.List と似た関数
• head, tail, init, null, length, map, foldl,
foldr, concat, takeWhile, filter など
• ...
文字列用プログラムを
bytestring 向けに
1. 修飾付き import する
2. 対応する関数の前にモジュール名を
付け足す
• まず文字列で書いて、性能が足りなか
ったら bytestring を試すのがオススメ
Monday, ...
Upcoming SlideShare
Loading in...5
×

Haskell超初心者勉強会11

374

Published on

Published in: Technology, Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
374
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Haskell超初心者勉強会11

  1. 1. Haskell超初心者勉強会 11回 2013/7/29 Monday, July 29, 13
  2. 2. 今日は「すごいHaskell」本 9章 もっと入力、もっと出力 •入力ストリームからの読み込み •ファイルの読み書き •コマンドライン引き数 •ランダム性 •bytestring Monday, July 29, 13
  3. 3. 入力ストリーム •getContents :: IO String •一度に全てを読み込まない。 メモリを食いつぶさない。 文字列(文字リスト)を遅延評価する。 import Data.Char main = do contents <- getContents putStr $ map toUpper contents Monday, July 29, 13
  4. 4. ファイルの読み込み •hFoo は Handle を引数に取る関数 •hGetContents は stdin の代わりに handle から読み込む •遅延評価 import System.IO main = do handle <- openFile “baabaa.txt” ReadMode contents <- hGetContents handle putStr contents hClose handle Monday, July 29, 13
  5. 5. ファイルの読み込み withFile •開いて、関数実行して、閉じる •例外の場合でも確実に閉じる import System.IO main = do withFile “baabaa.txt” ReadMode $ handle do contents <- hGetContents handle putStr contents Monday, July 29, 13
  6. 6. Control.Exception の bracket •何かして、関数実行して、何かする withFile’ :: FilePath -> IOMode -> (Handle -> IO a) withFile’ name mode f = bracket (openFile name mode) (handle -> hClose handle) (handle -> f handle) Monday, July 29, 13
  7. 7. Control.Exception の bracketOnError •何かして、関数実行して、 例外のときだけ何かする •例:一時ファイルを開いて、 処理する、 例外のときだけ一時ファイルを消す Monday, July 29, 13
  8. 8. その他の h •h じゃない版と同じ挙動 (handle を取る意外は) hClose hGetContents hGetLine hPutStr hPutStrLn hGetChar Monday, July 29, 13
  9. 9. readFile •readFile :: FilePath -> IO String •開いて読んで閉じる import System.IO main = do contents <- readFile “baabaa.txt” putStr contents Monday, July 29, 13
  10. 10. writeFile/appendFile •readFile :: FilePath -> String -> IO () •開いて書いて閉じる import System.IO main = do contents <- readFile “baabaa.txt” writeFile “baabaacaps.txt” (map toUpper contents) Monday, July 29, 13
  11. 11. コマンドライン引数 •System.Environment の getArgs/ getProgName import System.Environment import Data.List main = do args <- getArgs progName <- getProgName putStrLn “The arguments are:” mapM putStrLn args putStrLn “The Program name is:” putStrLn progName Monday, July 29, 13
  12. 12. ランダム性 •System.Random モジュール •RandomGen型クラス: ランダム性の源として使える型 •Random型クラス: ランダムな値として使える型 random :: (RandomGen g, Random a) => g -> (a,g) mkStdGen :: Int -> StdGen Monday, July 29, 13
  13. 13. 乱数のテスト •random はピュアな関数 •乱数を続けて発生させるときは 戻り値の RandomGen を次の乱数源 として使う > random (mkStdGen 100) :: (Int, StdGen) (-3650871090684229393,693699796 2103410263) > random (mkStdGen 100) :: (Int, StdGen) (-3650871090684229393,693699796 2103410263) Monday, July 29, 13
  14. 14. randoms •ランダム値の無限リストを返す •RandomGen は返さない randoms :: (RandomGen g, Random a) => g -> [a] Monday, July 29, 13
  15. 15. randomR •ある範囲の乱数を返す •(下限, 上限) -> (ジェネレータ) -> (乱数, 新ジェネレータ) randomR :: (RandomGen g, Random a) => (a, a) -> g -> (a, g) Monday, July 29, 13
  16. 16. getStdGen •グローバル乱数ジェネレータを返す •プログラム実行毎に違う値 •1実行中は同じ値を返す getStdGen :: IO StdGen Monday, July 29, 13
  17. 17. newStdGen •グローバル乱数ジェネレータを更新 •新しい乱数ジェネレータを返す newStdGen :: IO StdGen Monday, July 29, 13
  18. 18. thunk •サンク(thunk)=遅延された計算 •リストの未評価の部分は thunk •文字列(文字リスト)は thunk が 沢山なので遅い Monday, July 29, 13
  19. 19. bytestring •リストに似たデータ構造 •要素は 1 byteのサイズ固定 Monday, July 29, 13
  20. 20. 正格 vs 遅延 • 正格 bytestring (Data.ByteString) • thunk なし • 最初のバイトを評価する時、全体を評価 • 遅延 bytestring (Data.ByteString.Lazy) • 64KB chunk 毎に評価される • 64KB は L2 cache にフィットする 良いサイズ Monday, July 29, 13
  21. 21. pack/unpack •リストと相互変換 •Word8 は 8 bits unsigned int pack :: [Word8] -> ByteString unpack :: ByteString -> [Word8] > import qualified Data.ByteString.Lazy as B > let x = B.pack [99, 97, 110] > x “can” > B.unpack x [99, 97, 110] Monday, July 29, 13
  22. 22. fromChunks •正格ByteStringのリスト -> 遅延ByteString Monday, July 29, 13
  23. 23. bytestring モジュール の関数 • Data.List と似た関数 • head, tail, init, null, length, map, foldl, foldr, concat, takeWhile, filter など • http://hackage.haskell.org/package/ bytestring/ • System.IO と似た関数 • readFile :: FilePath -> IO ByteString など Monday, July 29, 13
  24. 24. 文字列用プログラムを bytestring 向けに 1. 修飾付き import する 2. 対応する関数の前にモジュール名を 付け足す • まず文字列で書いて、性能が足りなか ったら bytestring を試すのがオススメ Monday, July 29, 13
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×