PROGRAMMING IN HASKELL

Slides:



Advertisements
Similar presentations
第 2 章 数値の入力と変数 scanf と変数をやります 第 2 章 数値の入力と変数 1. 以下のプログラムを実行してみよう  C 言語では文の最後に「 ; 」(セミコロン)が付きます 第 2 章 数値の入力と変数 2 #include int main() { int x; x = 3; printf("x.
Advertisements

1 繰り返し処理 while 文 と do 文 所定回反復(特定回数の繰り返し)には for 文を用いた while( 式 ) 文 式が真であるかぎり、文を繰り返し実行する 繰り返す回数が不定の場合に用いる 繰り返し回数が明示的に決まらない場合には while 文、 do 文を用いる ある手順を、例えば.
プロセスの生成とコマンドの実行 プロセスの生成とコマンドの実行 プロセス生成のシステムコール プロセス生成のシステムコール プロセス生成のプログラム例 プロセス生成のプログラム例 プログラム実行のシステムコール プログラム実行のシステムコール 子プロセスの終了を待つシステムコール 子プロセスの終了を待つシステムコール.
自然言語処理プログラミング勉強会0 - プログラミング入門
東京工科大学 コンピュータサイエンス学部 亀田弘之
京都大学情報学研究科 通信情報システム専攻 湯淺研究室 M2 平石 拓
コンパイラ 2011年10月17日
プログラミング言語としてのR 情報知能学科 白井 英俊.
IO - 入出力 小西 亨.
リダイレクト パイプ 標準入出力プログラム コマンド行引数 関数 system()
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
基礎プログラミングおよび演習 第9回
プログラミング基礎I(再) 山元進.
第2回ネットワークプログラミング 中村 修.
はじめに 教科書 プログラミングHaskell Graham Hutton (著), 山本 和彦 (翻訳) オーム社、全 232 ページ
型宣言 (Type Declarations)
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
型宣言(Type Declarations)
条件式 (Conditional Expressions)
コンパイラ 2012年10月15日
テキストボックス、チェックボックス×2、コマンドボタンを配置する。 コマンドボタンに機能を与える
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
第10章 char 文字列; 文字列を入力させるよ!.
11.6 ランダムアクセスファイル 11.7 StreamTokenizerクラス
プログラミング言語入門 手続き型言語としてのJava
プログラミング 2 ファイル処理.
PROGRAMMING IN HASKELL
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
PROGRAMMING IN HASKELL
情報処理演習 (秋学期・樋口担当) 3回目 10/8 日本工業大学 コンピュータリテラシーII.
PROGRAMMING IN HASKELL
FlexとBison+アルファ -実習編-
PROGRAMMING IN HASKELL
リダイレクト パイプ 標準入出力プログラム コマンド行引数 関数 system()
プログラミング演習I 2003年6月25日(第10回) 木村巌.
PROGRAMMING IN HASKELL
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
デジタル画像とC言語.
プログラミング基礎a 第10回 Javaによる図形処理入門(2) GUIの使い方
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
UNIX演習 情報ネットワーク特論.
東京工科大学 コンピュータサイエンス学部 亀田弘之
プログラミング基礎B 文字列の扱い.
アルゴリズム論 (第12回) 佐々木研(情報システム構築学講座) 講師 山田敬三
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
情報工学科 3年生対象 専門科目 システムプログラミング 第4回 シェルスクリプト 情報工学科 篠埜 功.
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
OSが管理している、デフォルトの入出力装置 入力:stdin キーボード 出力:stdout モニタ(コマンドプロンプトの画面)
C言語 はじめに 2016年 吉田研究室.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
プログラミング演習I 2003年7月2日(第11回) 木村巌.
基礎プログラミング演習 第3回.
計算機プログラミングI 第3回 プリミティブ値 クラスメソッド クラス変数 式と演算 変数の利用
PROGRAMMING IN HASKELL
情報処理Ⅱ 第7回 2004年11月16日(火).
PROGRAMMING IN HASKELL
cp-15. 疑似乱数とシミュレーション (C プログラミング演習,Visual Studio 2019 対応)
情報実習I (第1回) 木曜4・5限 担当:北川 晃.
コンパイラ 2012年10月11日
アルゴリズムとデータ構造 補足資料6-1 「サンプルプログラムcat1.c」
PROGRAMMING IN HASKELL
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
情報処理Ⅱ 2005年11月25日(金).
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
第2章 数値の入力と変数 scanfと変数をやります.
分岐(If-Else, Else if, Switch) ループ(While, For, Do-while)
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
第1章 文字の表示と計算 printfと演算子をやります.
Presentation transcript:

PROGRAMMING IN HASKELL Chapter 9 - Interactive Programs 対話プログラム 愛知県立大学 情報科学部 計算機言語論(山本晋一郎・大久保弘崇、2011年)講義資料 オリジナルは http://www.cs.nott.ac.uk/~gmh/book.html を参照のこと

Introduction 8 章まで、Haskell でバッチ処理プログラムを作る方法を見てきた。このとき、全ての入力は開始時に与えられ、全ての出力は終了時に得られる。 batch program inputs outputs

しかし、Haskell で対話的なプログラムも作りたい。このとき、プログラムが動作している間に、キーボードから入力を読み取り、スクリーンに出力される。 interactive program inputs outputs keyboard screen

問題点 Haskell のプログラムは数学的に純粋な関数である: Haskell のプログラムは副作用(side effect)を持たない しかし、キーボードからの入力やスクリーンへの出力は副作用である: 対話的プログラムは副作用を持つ

解決策 Haskell で対話的プログラムを書くとき、純粋な式と副作用をもたらす純粋でないアクションを型によって区別する IO a 型 a の値を返すアクションの型

For example: 文字を返すアクションの型 値を返さない、純粋な 副作用のアクションの型 Note: IO Char IO ()

基本アクション 標準ライブラリは以下の 3 つのプリミティブを含む多くのアクションを提供する: アクション getChar は、キーボードから 1 文字を読み、スクリーンにエコーバックし、その文字を結果の値として返す: getChar :: IO Char

アクション purChar c は、文字 c をスクリーンに 出力し、何も返さない: putChar :: Char  IO () アクション return v は、対話処理を行わず、 単に値 v を返す: return :: a  IO a

アクションの列(連結、Sequencing) 8 章の do とのアナロジー ひとつながりのアクション群は、予約語 do を用いて 一つの合成アクションに結合することができる 例: a :: IO (Char,Char) a = do x  getChar getChar y  getChar return (x,y)

導出されたアクションの部品 キーボードから 1 行読み込む: getLine :: IO String getLine = do x  getChar if x == '\n' then return [] else do xs  getLine return (x:xs)

文字列をスクリーンに出力する: 文字列をスクリーンに出力して改行する: putStr :: String  IO () putStr [] = return () putStr (x:xs) = do putChar x putStr xs 文字列をスクリーンに出力して改行する: putStrLn :: String  IO () putStrLn xs = do putStr xs putChar '\n'

Example 文字列の入力を促すプロンプトを表示し、入力された文 字列の長さを表示するアクション: strlen :: IO () strlen = do putStr "Enter a string: " xs  getLine putStr "The string has " putStr (show (length xs)) putStrLn " characters"

アクションを評価すると、その副作用が実行され、 その最終結果の値は捨てられる For example: > strlen Enter a string: abcde The string has 5 characters Note: アクションを評価すると、その副作用が実行され、 その最終結果の値は捨てられる

ここから教科書に載っていない ハングマンというゲームの説明

Hangman 次のようなハングマンというゲームを考える: プレイヤーが英単語をこっそり入力する 別なプレイヤーはその単語を推測し、入力する 計算機は、毎回の推測毎に、秘密の単語中のどの文字が、推測された単語に出現するかを示す 推測が的中するとゲームは終了

Haskellでハングマンを実装するのに、トップダウンのアプローチを採用し、次のコードから始める: hangman :: IO () hangman = do putStrLn "Think of a word: " word  sgetLine putStrLn "Try to guess it:" guess word

アクション sgetLine は、ダッシュ記号をエコーバックしつつ、キーボードから 1 行のテキストを読み込む: sgetLine :: IO String sgetLine = do x  getCh if x == '\n' then do putChar x return [] else do putChar '-' xs  sgetLine return (x:xs)

アクション getCh はキーボードから 1 文字を読み込むが、スクリーンにエコーバックしない Note: アクション getCh はキーボードから 1 文字を読み込むが、スクリーンにエコーバックしない この便利なアクションは標準ライブラリではなく、Hugs の特別なプリミティブであるため、次のようにインポートする: primitive getCh :: IO Char

関数 guess がメインループであり、ゲームが終了する まで、プレイヤーの推測を促して処理を行う guess :: String  IO () guess word = do putStr "> " xs  getLine if xs == word then putStrLn "You got it!" else do putStrLn (diff word xs) guess word

関数 diff は、1 つめの文字列中のどの文字が、 2 つめの文字列に出現しているかを示す: diff :: String  String  String diff xs ys = [if elem x ys then x else '-' | x  xs] 例: > diff "haskell" "pascal" "-as--ll"

まとめ(9章) Haskell の式 アクションの部品 純粋な式 大部分の式 純粋な式 大部分の式 純粋でない式 アクション、副作用を伴う IO a は型 a を返すアクションの型 IO Char 文字を返すアクションの型 IO () 値を返さない、純粋な副作用の型 アクションの部品 getChar :: IO Char 1 文字入力、入力された文字を返す putChar :: Char -> IO () 1 文字出力、戻り値なし return v :: a -> IO a 対話処理を行わず、値 v を返す getLine :: IO String 行入力、入力された文字列を返す putStr :: String -> IO () 行出力、戻り値なし (putStrLn は改行付き) 部品から新しいアクションを構成する do { x  p1; p2; …; y  pn; } (連結)

練習問題(9章) 教科書 p.109 の strlen を実行して、動作を確認せよ スライドに説明されているハングマンを実行して、動作を確認せよ Hangman.hs を講義 Web からダウンロードせよ http://www.ist.aichi-pu.ac.jp/lab/yamamoto/program_languages/2011/ 教科書の電卓またはライフゲームのどちらかを実行して動作を確認すると共に、プログラムを簡単に説明せよ 分からない部分があれば、明示せよ

動作確認方法(Linux) http://www.cs.nott.ac.uk/~gmh/book.html の Code から以下のファイルをダウンロードする calculator.lhs (Calculator, 9.6 節まで) life.lhs (Game of life, 9.7 節) Parsing.lhs (Functional parsing library, 8 章と同じ) calculator.lhs と Parsing.lhs を同じディレクトリに置く calculator.lhs が Parsing.lhs を import しているため Linux 上の ghci で以下を実行する calculator.lhs をロードし、run と入力すれば、教科書の電卓の動作を確認できる life.lhs をロードし、 life glider と入力すれば、教科書のライフゲームの動作を確認できる

動作確認方法(Windows, その1) http://www.cs.nott.ac.uk/~gmh/book.html の Code から以下のファイルをダウンロードする Parsing.lhs (Functional parsing library, 8 章と同じ) http://www.ist.aichi-pu.ac.jp/lab/yamamoto/program_languages/ の 2011 年度から変更済みのファイルをダウンロードする calculatoWin.lhs (Calculator, 9.6 節まで) lifeWin.lhs (Game of life, 9.7 節) calculatorWin.lhs と Parsing.lhs を同じディレクトリに置く calculatorWin.lhs が Parsing.lhs を import しているため

動作確認方法(Windows, その2) ansi-terminal をインストールする Windows の GHCi で以下を実行する cabal は Haskell Platform に付属するコマンド コマンドプロンプトを起動する リポジトリをアップデートする $ cabal update ansi-terminal をインストールする $ cabal install ansi-terminal Windows の GHCi で以下を実行する 現時点では、WinGHCi で動作しない calculatorWin.lhs をロードし、run と入力すれば、教科書の電卓の動作を確認できる lifeWin.lhs をロードし、 life glider と入力すれば、教科書のライフゲームの動作を確認できる

演習問題 Nim というゲームを Haskell で実装せよ。ゲームのルールは以下の通り: ゲーム盤は星が入る 5 つの列からなる: 1: * * * * * 2: * * * * 3: * * * 4: * * 5: *

2 人のプレイヤーは、交互に、どれか 1 つの行を選び、その末尾から 1 つ以上の星を取り去る ゲーム盤上の最後の星を取った方が勝ち ヒント: ゲーム盤を、それぞれの列にある星の数を意味する 5 つの整数からなるリストで表す。 例えば、初期状態は [5,4,3,2,1] となる。