はじめに 教科書 プログラミングHaskell Graham Hutton (著), 山本 和彦 (翻訳) オーム社、全 232 ページ

Slides:



Advertisements
Similar presentations
2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
Advertisements

プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
なぜ今Pythonか? Pythonをお薦めする18の理由
プログラミング言語ADP 大藤雄久.
アルゴリズムとデータ構造 第2回 線形リスト(復習).
(Rubyistのための) 超音速:ML入門
京都大学情報学研究科 通信情報システム専攻 湯淺研究室 M2 平石 拓
プログラミング言語としてのR 情報知能学科 白井 英俊.
プログラミングパラダイム さまざまな計算のモデルにもとづく、 プログラミングの方法論 手続き型 関数型 オブジェクト指向 代数 幾何.
型宣言 (Type Declarations)
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
型宣言(Type Declarations)
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
情報科学1(G1) 2016年度.
条件式 (Conditional Expressions)

ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
プログラミング言語論 第12回 関数型プログラミング 情報工学科 篠埜 功.
データベース設計 第9回 Webインタフェースの作成(1)
シミュレーション演習 G. 総合演習 (Mathematica演習) システム創成情報工学科
プログラミング基礎a 第8回 プログラムの設計 アルゴリズムとデータ構造
PROGRAMMING IN HASKELL
プログラミング言語入門 手続き型言語としてのJava
PROGRAMMING IN HASKELL
PROGRAMMING IN HASKELL
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
PROGRAMMING IN HASKELL
PROGRAMMING IN HASKELL
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
京都大学情報学研究科 通信情報システム専攻 湯淺研究室 D1 平石 拓 2005/10/18
プログラミング言語入門.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
PROGRAMMING IN HASKELL
お仕事にまったく役にたたない内容のコードレビューやりたいと思います。
プログラミング基礎a 第8回 プログラムの設計 アルゴリズムとデータ構造
PHP 概要 担当 岡村耕二 月曜日 2限 平成22年度 情報科学III (理系コア科目・2年生)
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
書き換え型プログラムの生成・検証 研究課題:適切な実行戦略を効率よく探索する、 より自動化された手続きの実現 書き換え型プログラム
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
 型推論3(MLの多相型).
C言語 はじめに 2016年 吉田研究室.
15.cons と種々のデータ構造.
プログラミング基礎a 第6回 C言語によるプログラミング入門 配列と文字列(その2)
統計ソフトウエアRの基礎.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
Webインテリジェンス論 Protégé演習 (インストール)
PROGRAMMING IN HASKELL
~sumii/class/proenb2010/ml2/
情報処理Ⅱ 第7回 2004年11月16日(火).
~sumii/class/proenb2009/ml6/
PROGRAMMING IN HASKELL
第6回放送授業.
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
PROGRAMMING IN HASKELL
オブジェクト指向言語論 第一回 知能情報学部 新田直也.
プログラミング演習I 2003年6月11日(第9回) 木村巌.
Haskell Programming Language
情報処理Ⅱ 2005年11月25日(金).
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
プログラミング基礎a 第5回 C言語によるプログラミング入門 配列と文字列
情報処理Ⅱ 小テスト 2005年2月1日(火).
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
One Day Science Program コンピュータで数学を
7-Zipのインストール (Windows 10)
情報処理Ⅱ 第8回:2003年12月9日(火).
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
Presentation transcript:

PROGRAMMING IN HASKELL Chapter 1 – Introduction 導入 愛知県立大学 情報科学部 計算機言語論(山本晋一郎・大久保弘崇、2013年)講義資料 オリジナルは http://www.cs.nott.ac.uk/~gmh/book.html を参照のこと

はじめに 教科書 プログラミングHaskell Graham Hutton (著), 山本 和彦 (翻訳) オーム社、全 232 ページ 成績: 試験とレポートを総合的に評価

参考 URL 愛知県立大学 情報科学部 計算機言語論 (2013 年度の日本語版スライドなどを含む) http://www.ist.aichi-pu.ac.jp/lab/yamamoto/program_languages/ 訳者によるサポートページ(正誤表など) http://www.mew.org/~kazu/doc/book/haskell.html 著者によるサポートページ (正誤表、英語版スライドなど) http://www.cs.nott.ac.uk/~gmh/book.html Haskellに関する包括的な情報源 http://www.haskell.org/

それはどんな言語だ!? What‘s faster than C++, more concise than Perl, more regular than Python, more flexible than Ruby, more typeful than C#, more robust than Java, and has absolutely nothing in common with PHP? It's Haskell! C++よりも高速で、Perlよりも簡潔で、Pythonよりも例外が少なく、Rubyよりも柔軟で、C#よりも型付いていて、Javaよりも頑丈で、PHPとは似ても似つかない言語は? それは Haskell! もっとも表現力に富んだ汎用プログラム言語は Clojure,CoffeeScript,Haskell http://www.infoq.com/jp/news/2013/04/Language-Expressiveness

関数型プログラミング言語とは!? 全てが関数(全てが式と言い換えても良い) C 言語も(全てが)関数で構成されている 式は定数,変数,関数呼び出し(1 引数以上)から成る 定数は一定の値を返す 0 引数の関数 変数は 1 回だけ代入(変更できない 、何度参照しても同じ値) 計算は式の値を求めること C 言語も(全てが)関数で構成されている 本当? if 文,for 文,ブロックは式ではない(値を持たない) 関数を値にできない(ポインタ!?) プログラムの実行中に新しい関数を作れない

ソフトウェア危機(The Software Crisis) プログラムの規模と複雑さにどのように対処すべきか? プログラム開発の期間とコストを削減する方法は? 開発したプログラムが正しく動作するという確信をどのようにしたら持てるのか?

プログラミング言語 次のような性質を備えた新しいプログラミング言語によりソフトウェア危機に対処する: 明確、簡潔、高い抽象度のプログラミングが可能 ソフトウェア部品の再利用が支援されている 形式的検証(formal verification)が容易

ラピッドプロトタイピング(rapid prototyping)が容易 問題解決の強力なツールとなり得る 関数型言語(functional languages)はこれらの目標を達成するためのエレガントな枠組み 7

関数型(プログラミング)言語とは? さまざまな見解があり、正確に定義することは難しいが、一般論としては: 関数プログラミングとは、「関数を引数へ適用すること」を計算原理とするプログラミングの流儀(style) 関数型言語とは、関数プログラミングの流儀を 支援(support)し、奨励(encourage)するプログラミング言語

例 1 から 10 を足し合わせる Java/C プログラム: 計算原理は変数への代入(variable assignment) total = 0; for (i = 1; i  10; i++) { total = total + i; } 計算原理は変数への代入(variable assignment) ・蓄えられている値が変化していく ・人は変化を追跡することが苦手 9

例 1 から 10 を足し合わせる Haskell プログラム: 計算原理は関数を引数に適用すること sum [1..10] 計算原理は関数を引数に適用すること (function application) [1..10] は整数のリスト [1, 2, 3,…, 10] を生成し、 sum はリストの要素の総和を求める 10

Historical Background Alonzo Church が単純だけど強力な関数の理論である  算法(lambda calculus)を開発 11

Historical Background John McCarthy が、最初の関数型言語である Lispを開発。 算法に影響を受けているが、計算原理として変数代入を採用していた。 12

Historical Background Peter Landin が世界初の純粋な関数型言語である ISWIM を開発。  算法に強く基礎を置いており、変数代入を排除した。 13

Historical Background John Backus が関数型言語 FP を開発。高階関数とプログラミングの論証に重点を置いた言語である。 14

Historical Background Robin Milner らが最初の現代的な関数型言語である ML を開発し、型推論と多相型を導入した 15

Historical Background 1970s - 1980s: David Turner が遅延評価(lazy evaluation)をもつ関数型言語の開発を進めた(Mirandaとして結実) lazyはほめ言葉! 16

Historical Background 1987: lazy な関数型言語が乱立したので、標準 (Haskell)を設定する委員会が発足 17

Historical Background 2003: 委員会が Haskell 98 Report を公開し, 安定版の言語仕様を定めた(Haskell 2010 へ発展) 18

Haskell はこんな感じ(リスト) [] 空のリスト(長さ0) [1] 長さ1のリスト(要素は1) 要素は同一の型である [1, ’a’] は許されない Haskell はこんな感じ(リスト) [] 空のリスト(長さ0) [1] 長さ1のリスト(要素は1) [1,2] 長さ2のリスト(先頭要素は1、次の要素は2) [1,2,3] 長さ3のリスト x:xs リスト xs の前に要素を 1 つ追加したリスト 1:[] = [1] 1:2:[] = 1:[2] = [1,2] 1:2:3:[] = 1:2:[3] = 1:[2,3] = [1,2,3] 19

Haskell はこんな感じ(整数リスト) [] // 長さ 0 の整数リスト 1:[] = [1] // 長さ 1 の整数リスト 1:2:[] = 1:(2:[]) // 長さ 2 の整数リスト = 1:[2] = [1,2] 1:2:3:[] = 1:(2:(3:[])) // 長さ 3 の整数リスト = 1:(2:[3]) = 1:[2,3] = [1,2,3] 20

Haskell はこんな感じ(文字列リスト) ”a”:[] = [”a”] // 長さ 1 の文字列リスト ”x”:”y”:[] = [”x”,”y”] // 長さ 2 の文字列リスト [”Aichi”,”Gifu”,”Mie”] // 長さ 3 の文字列リスト ”Shizuoka”:[”Aichi”,”Gifu”,”Mie”] = [”Shizuoka”,”Aichi”,”Gifu”,”Mie”] // 長さ 4 の文字列リスト 21

リスト(Cons 演算子) 演算子 `:’ は、x:xs によって、リスト xs の前に要素を 1 つ 追加したリストを返す [1] = 1:[] [1,2] = 1:(2:[]) [1,2,3] = 1:(2:(3:[])) : 1 [] : 1 2 [] : 2 3 [] 1

Haskell はこんな感じ(リストの演算) ++ リストの連結 [] ++ [1,2,3] = [1,2,3] [1,2,3] ++ [] = [1,2,3] [1,2,3] ++ [4,5] = [1,2,3,4,5] [1,2,3] ++ [] ++ [4,5] = [1,2,3,4,5] head リストの先頭要素 head [1,2,3] = 1 tail リストの先頭要素を除いたリスト tail [1,2,3] = [2,3] 23

Haskell はこんな感じ(リストの補足) 長さ 2 のリスト [1,2] = [1] ++ [2] = [] ++ [1] ++ [2] = [1] ++ [] ++ [2] = [1] ++ [2] ++ [] == 2 つのリストが等しいか否かを判定 > [1,2] == 1:[2] True > [1,2] == 1:[3] False 24

Haskell はこんな感じ(数値リストの総和) sum [] = 0 sum (x:xs) = x + sum xs sum [1,2,3]  = 1 + sum [2,3] = 1 + (2 + sum [3])  = 1 + (2 + (3 + sum []))  = 1 + (2 + (3 + 0))  = 6 25

Haskell はこんな感じ(フィボナッチ数列) fib  = 1:1:[a+b | (a,b)  zip fib (tail fib)] zip は 2 つのリストの要素を互いにペアにしたリストを返す zip [1,2,3] ['a','b','c‘] = [(1,'a'),(2,'b'),(3,'c')] 26

? Haskell はこんな感じ q [] = [] q (x:xs) = q smaller ++ [x] ++ q larger where smaller = [a | a  xs, a  x] larger = [b | b  xs, b > x] ? where は “ここで” あるいは “ただし” と読む 27

Haskell はこんな感じ(クイックソート) 他のプログラミング言語と比べて簡潔 Haskell はこんな感じ(クイックソート) q [] = [] q (x:xs) = (q smaller) ++ [x] ++ (q larger) where smaller = [a | a  xs, a  x] larger = [b | b  xs, b > x] 空リストはソート済み 非空リストのソートは以下の 3 つのリストの連結 (残りのリスト中の先頭要素以下の要素)をソートしたリスト 先頭要素のみのリスト (残りのリスト中の先頭要素より大きな要素)をソートしたリスト

例: q [3,2,4,1,5] q [2,1] ++ [3] ++ q [4,5] q [1] q [] ++ [2] ++ q [] ++ [4] ++ [1] [] [] [5] ([1] ++ [2] ++ []) ++ [3] ++ ([] ++ [4] ++ [5])

GHC (Haskell Platform) ghc はコンパイラ、ghciはインタプリタ ghci の対話性は教育とプロトタイピングに適している Haskell Platform は,GHC にライブラリやツールなどを加えた環境一式を提供 Windows, Mac, Linux 版が利用可能 以下のサイトからダウンロードできる http://hackage.haskell.org/platform/ 教科書では Hugs を使っているが、広く用いられている GHC (ghci)を用いれば良い

Haskell Platform のインストール (1/4) Windows へのインストール方法 ブラウザから http://hackage.haskell.org/platform/windows.html へアクセス [Download Haskell for Windows] をクリックし,[HaskellPlatform-2012.4.0.0-setup.exe] を保存する 保存した [HaskellPlatform-2012.4.0.0-setup.exe] を実行する [Next] を押す

Haskell Platform のインストール (2/4) Windows へのインストール方法 インストールの場所を選択し,[Next] をクリックする

Haskell Platform のインストール (3/4) Windows へのインストール方法 インストールのタイプは [Standard] を選択し,[Next] をクリックする

Haskell Platform のインストール (4/4) Windows へのインストール方法 [Install] をクリックするとインストールが実行される

WinGHCi の起動方法 以下の手順で WinGHCi を起動する [スタートボタン] → [すべてのプログラム] → [Haskell Platform 2012.4.0.0] → [WinGHCi]

Starting Hugs UNIX では、シェルプロンプトから hugs (ghci) を起動する Windows では、スタートメニュの Haskell Platformから、GHCi か WinGHCi を起動する % hugs __ __ __ __ ____ ___ _________________________________________ || || || || || || ||__ Hugs 98: Based on the Haskell 98 standard ||___|| ||__|| ||__|| __|| Copyright (c) 1994-2005 ||---|| ___|| World Wide Web: http://haskell.org/hugs || || Bugs: http://hackage.haskell.org/trac/hugs || || Version: September 2006 _________________________________________ Haskell 98 mode: Restart with command line option -98 to enable extensions Type :? for help Hugs> % ghci GHCi, version 6.12.3: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer-gmp ... linking ... done. Loading package base ... linking ... done. Prelude>

まとめ(1章) 関数(型)プログラミング言語 手続き型言語(C や Java 等)と何が違うの? 簡潔なプログラミングの例 処理系 「関数を引数へ適用すること」を計算原理とする 手続き型言語(C や Java 等)と何が違うの? 「変数への代入」が計算原理 蓄えられている値が変化していく、変化を追跡することは難しい 簡潔なプログラミングの例 1 から 10 を足し合わせる クイックソート 処理系 Windows, Mac, Linux 版の GHC がダウンロード可能 sum [1..10] q [] = [] q (x:xs) = (q smaller) ++ [x] ++ (q larger) where smaller = [a | a  xs, a  x] larger = [b | b  xs, b > x]