SlideShare a Scribd company logo
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 <- getContents
putStr $ map toUpper contents
Monday, July 29, 13
ファイルの読み込み
•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
ファイルの読み込み
withFile
•開いて、関数実行して、閉じる
•例外の場合でも確実に閉じる
import System.IO
main = do
withFile “baabaa.txt” ReadMode $ handle do
contents <- hGetContents handle
putStr contents
Monday, July 29, 13
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
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 contents
Monday, July 29, 13
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
コマンドライン引数
•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
ランダム性
•System.Random モジュール
•RandomGen型クラス:
ランダム性の源として使える型
•Random型クラス:
ランダムな値として使える型
random :: (RandomGen g, Random a) => g -> (a,g)
mkStdGen :: Int -> StdGen
Monday, July 29, 13
乱数のテスト
•random はピュアな関数
•乱数を続けて発生させるときは
戻り値の RandomGen を次の乱数源
として使う
> random (mkStdGen 100) :: (Int, StdGen)
(-3650871090684229393,693699796 2103410263)
> random (mkStdGen 100) :: (Int, StdGen)
(-3650871090684229393,693699796 2103410263)
Monday, July 29, 13
randoms
•ランダム値の無限リストを返す
•RandomGen は返さない
randoms :: (RandomGen g, Random a) => g -> [a]
Monday, July 29, 13
randomR
•ある範囲の乱数を返す
•(下限, 上限) -> (ジェネレータ) ->
(乱数, 新ジェネレータ)
randomR :: (RandomGen g, Random a) =>
(a, a) -> g -> (a, g)
Monday, July 29, 13
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 chunk 毎に評価される
• 64KB は L2 cache にフィットする
良いサイズ
Monday, July 29, 13
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
fromChunks
•正格ByteStringのリスト ->
遅延ByteString
Monday, July 29, 13
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
文字列用プログラムを
bytestring 向けに
1. 修飾付き import する
2. 対応する関数の前にモジュール名を
付け足す
• まず文字列で書いて、性能が足りなか
ったら bytestring を試すのがオススメ
Monday, July 29, 13

More Related Content

PDF
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
PPTX
前期講座09
PPTX
HUで6000万pvのトラフィックを捌くまでに起ったことをありのままに話すぜ
KEY
カジュアルにソースコードリーディング
PPTX
R -> Python
PDF
Cloud computing competition by Hapyrus
PDF
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
PDF
Rakuten tech conf
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
前期講座09
HUで6000万pvのトラフィックを捌くまでに起ったことをありのままに話すぜ
カジュアルにソースコードリーディング
R -> Python
Cloud computing competition by Hapyrus
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
Rakuten tech conf

What's hot (20)

PDF
mlr-grep - レコード指向grep
PDF
awk v.s. bashどっちが強い?@OSC2011Tokyo
PDF
TensorFlow White Paperを読む
PDF
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
PDF
PostgreSQLとPythonとSQL
PDF
ジャパネットQB GPars
PDF
Common LispでGPGPU
PPT
20090107 Postgre Sqlチューニング(Sql編)
PDF
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
PDF
StarlingAssetmanagerの説明
PDF
200319 eash python_shareslide_functions
PDF
mmapパッケージを使ってお手軽オブジェクト管理
PDF
Elasticsearch入門 pyfes 201207
PDF
Haskell で CLI
PPTX
入門機械学習6章
PDF
Redis Intro Osc2010 Tokyo Spring
PDF
入門機械学習1,2章
PDF
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
PDF
GNU awk (gawk) を用いた Apache ログ解析方法
PDF
Log analysis by using elasticsearch,kibana and fluentd.
mlr-grep - レコード指向grep
awk v.s. bashどっちが強い?@OSC2011Tokyo
TensorFlow White Paperを読む
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
PostgreSQLとPythonとSQL
ジャパネットQB GPars
Common LispでGPGPU
20090107 Postgre Sqlチューニング(Sql編)
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
StarlingAssetmanagerの説明
200319 eash python_shareslide_functions
mmapパッケージを使ってお手軽オブジェクト管理
Elasticsearch入門 pyfes 201207
Haskell で CLI
入門機械学習6章
Redis Intro Osc2010 Tokyo Spring
入門機械学習1,2章
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
GNU awk (gawk) を用いた Apache ログ解析方法
Log analysis by using elasticsearch,kibana and fluentd.
Ad

Viewers also liked (8)

PDF
Haskell超初心者勉強会14
PDF
Haskell超初心者勉強会20
PDF
Haskell超初心者勉強会17
PDF
Scala稟議の通し方(公開版)
PDF
Elastic beanstalk と Docker と Play
PDF
Scalaでの例外処理
PDF
Scalaのオブジェクトの話
PDF
やさしいIteratee入門
Haskell超初心者勉強会14
Haskell超初心者勉強会20
Haskell超初心者勉強会17
Scala稟議の通し方(公開版)
Elastic beanstalk と Docker と Play
Scalaでの例外処理
Scalaのオブジェクトの話
やさしいIteratee入門
Ad

More from Takashi Kawachi (6)

PDF
例外のlogを快適に
PDF
MacroPyがすごい
PDF
Silhouette intro
PDF
最小 Hello World! チャレンジ
PDF
Sbt doctest
PDF
Sbt lock1
例外のlogを快適に
MacroPyがすごい
Silhouette intro
最小 Hello World! チャレンジ
Sbt doctest
Sbt lock1

Haskell超初心者勉強会11