advanced topics in haskell

36
Advanced Topics in Haskell オープンソースカンファレンス2007 Hokkaido 北海道大学学術交流会館 2006-06-30 14:30-15:15 第5会議室 池上 大介 [email protected] Haskell同好会 1

Upload: ikegami

Post on 06-May-2015

2.650 views

Category:

Technology


3 download

DESCRIPTION

A supplement to the talk for introduction to Haskell at Open Source Conference 2007

TRANSCRIPT

Page 1: Advanced Topics in Haskell

Advanced Topics in Haskell

オープンソースカンファレンス2007 Hokkaido北海道大学学術交流会館

2006-06-30 14:30-15:15 第5会議室

池上 大介[email protected]

Haskell同好会

1

Page 2: Advanced Topics in Haskell

関数型言語は

なぜ必要なのか

2

Page 3: Advanced Topics in Haskell

なぜ関数型言語?•“Why Haskell matters”Jens Petersen, RedHatLinux Conf., 2001-09• “Why Functional Programming matters”John Hughes, 2000

3

Page 4: Advanced Topics in Haskell

なぜ関数型言語?•Programming in HaskellGraham Hutton, 2007

4

Page 5: Advanced Topics in Haskell

なぜ関数型言語?

•ソフトウエア危機•工期短縮•正確さ•正確に動くプログラムとは?

•プログラム≠設計仕様

5

Page 6: Advanced Topics in Haskell

関数型言語が

ソフトウエア危機を

解決する

6

Page 7: Advanced Topics in Haskell

関数型言語のアプローチ•プログラムを•見やすく•正確に•High-Level of abstraction•高い再利用性•数理的手法に基づく検証

7

Page 8: Advanced Topics in Haskell

Haskellなら•rapid prototyping•powerful problem solvers•型推論

•最新の型理論に基づく技術

学習は容易ではない「道」

8

Page 9: Advanced Topics in Haskell

Haskell

のレイアウトルール

9

Page 10: Advanced Topics in Haskell

テーブルマナーにうるさい Haskell

a = 10 b = 20 c = 30

OK

a = 10 b = 20 c = 30

NG

a = 10 b = 20 c = 30

NG

10

Page 11: Advanced Topics in Haskell

初心者がはまるのが

レイアウトルール

11

Page 12: Advanced Topics in Haskell

Haskell の「ローカルな関数定義」

implicit grouping

a = b + c where b = 2 c = 3

a = b + c where { b = 2; c = 3; }

explicit grouping

マニアは左側のスタイルが好き→初心者???

12

Page 13: Advanced Topics in Haskell

レイアウトルール•ローカルな関数定義•do notation•初心者は知らない•Arrow notation•マニアでも知名度は低い•Template Haskell•???

13

Page 14: Advanced Topics in Haskell

Haskell

のレイアウトルール

は慣れるしかない

「道」

14

Page 15: Advanced Topics in Haskell

Haskell

の「型」とは何か

15

Page 16: Advanced Topics in Haskell

Graham Hutton の

Chapter 3 を読もう

16

Page 17: Advanced Topics in Haskell

Haskell

ならではの記述法

17

Page 18: Advanced Topics in Haskell

Graham Hutton の

Chapter 4,5 を読もう

18

Page 19: Advanced Topics in Haskell

再帰的関数が

もたらす幸せ

19

Page 20: Advanced Topics in Haskell

Graham Hutton の

Chapter 6 を読もう

20

Page 21: Advanced Topics in Haskell

高階関数が

もたらす幸せ

21

Page 22: Advanced Topics in Haskell

Graham Hutton の

Chapter 7 を読もう

22

Page 23: Advanced Topics in Haskell

Haskell で入出力を

どう書くか

IO モナド

23

Page 24: Advanced Topics in Haskell

Graham Hutton の

Chapter 9 を読もう

24

Page 25: Advanced Topics in Haskell

Haskell で自分が型を

定義するには?

25

Page 26: Advanced Topics in Haskell

Graham Hutton の

Chapter 10 を読もう

26

Page 27: Advanced Topics in Haskell

Haskell の型クラスって

何?

27

Page 28: Advanced Topics in Haskell

Graham Hutton の

Chapter 10 を読もう

28

Page 29: Advanced Topics in Haskell

Haskell FizzBuzz

29

Page 30: Advanced Topics in Haskell

main :: IO () main = mapM_ (putStrLn . fizzBuzz) [1..] fizzBuzz :: Integer -> String fizzBuzz x | x `mod` 15 == 0 = "FizzBuzz" | x `mod` 3 == 0 = "Fizz" | x `mod` 5 == 0 = "Buzz" | otherwise = show x

30

Page 31: Advanced Topics in Haskell

Haskellの黒魔術

31

Page 32: Advanced Topics in Haskell

1. unsafePerformIO

import System.IO.Unsafe unsafePerformIO :: IO a -> a

unsafe一族は存在する

32

Page 33: Advanced Topics in Haskell

2. unsafePerformIO

import Data.Generics cast :: (Typeable a, Typeable b) => a -> Maybe b

実行時型検査!

33

Page 34: Advanced Topics in Haskell

3.Haskell FFI

import Foreign data CChardata CInt

Cで書いてしまう(おお、神よ)

FFI = Foreign Function Interface

34

Page 35: Advanced Topics in Haskell

4.Windows API

import System.Win32 hKEY_CURRENT_USER :: HKEY

やろうと思えば MS-WordもWin32で

35

Page 36: Advanced Topics in Haskell

5.Dons’ evalhttp://www.cse.unsw.edu.au/~dons/hs-plugins/

eval :: Typeable a => String -> [Import] -> IO (Maybe a)

実行時にevalるもはや何でもあり

36