Haskell超初心者勉強会11
Upcoming SlideShare
Loading in...5
×
 

Haskell超初心者勉強会11

on

  • 520 views

 

Statistics

Views

Total Views
520
Views on SlideShare
520
Embed Views
0

Actions

Likes
0
Downloads
2
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Haskell超初心者勉強会11 Haskell超初心者勉強会11 Presentation Transcript

  • 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