SlideShare a Scribd company logo
1 of 24
Download to read offline
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

What's hot

ジャパネットQB GPars
ジャパネットQB GParsジャパネットQB GPars
ジャパネットQB GPars
Takahiro Sugiura
 
20090107 Postgre Sqlチューニング(Sql編)
20090107 Postgre Sqlチューニング(Sql編)20090107 Postgre Sqlチューニング(Sql編)
20090107 Postgre Sqlチューニング(Sql編)
Hiromu Shioya
 
mmapパッケージを使ってお手軽オブジェクト管理
mmapパッケージを使ってお手軽オブジェクト管理mmapパッケージを使ってお手軽オブジェクト管理
mmapパッケージを使ってお手軽オブジェクト管理
Shintaro Fukushima
 
Redis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo SpringRedis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo Spring
Makoto Ohnami
 
入門機械学習1,2章
入門機械学習1,2章入門機械学習1,2章
入門機械学習1,2章
Kazufumi Ohkawa
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
博文 斉藤
 

What's hot (20)

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

Viewers also liked (8)

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

More from Takashi Kawachi (6)

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

Recently uploaded

Recently uploaded (12)

論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 

Haskell超初心者勉強会11