haskell.gby

Similar documents
fp.gby

monad.gby

presen.gby

Parametric Polymorphism

untitled

10/ / /30 3. ( ) 11/ 6 4. UNIX + C socket 11/13 5. ( ) C 11/20 6. http, CGI Perl 11/27 7. ( ) Perl 12/ 4 8. Windows Winsock 12/11 9. JAV

K227 Java 2


解きながら学ぶC++入門編

Java updated

r02.dvi

r07.dvi

ohp07.dvi

# let st1 = {name = "Taro Yamada"; id = };; val st1 : student = {name="taro Yamada"; id=123456} { 1 = 1 ;...; n = n } # let string_of_student {n

r08.dvi

untitled

listings-ext

/* do-while */ #include <stdio.h> #include <math.h> int main(void) double val1, val2, arith_mean, geo_mean; printf( \n ); do printf( ); scanf( %lf, &v

新・明解Java入門

Jacques Garrigue

double float

超初心者用

1 C STL(1) C C C libc C C C++ STL(Standard Template Library ) libc libc C++ C STL libc STL iostream Algorithm libc STL string vector l

Java演習(4) -- 変数と型 --

やさしいJavaプログラミング -Great Ideas for Java Programming サンプルPDF


r03.dvi

Python Speed Learning

データ構造とアルゴリズム論

(Java/FX ) Java CD Java version Java VC++ Python Ruby Java Java Eclipse Java Java 3 Java for Everyone 2 10 Java Midi Java JavaFX Shape Canvas C

ohp03.dvi

I. Backus-Naur BNF S + S S * S S x S +, *, x BNF S (parse tree) : * x + x x S * S x + S S S x x (1) * x x * x (2) * + x x x (3) + x * x + x x (4) * *

つくって学ぶプログラミング言語 RubyによるScheme処理系の実装

新・明解C言語 実践編

3 Java 3.1 Hello World! Hello World public class HelloWorld { public static void main(string[] args) { System.out.println("Hello World");

Java講座

r1.dvi

新版明解C言語 実践編

8 if switch for while do while 2

Condition DAQ condition condition 2 3 XML key value

解きながら学ぶJava入門編

I ASCII ( ) NUL 16 DLE SP P p 1 SOH 17 DC1! 1 A Q a q STX 2 18 DC2 " 2 B R b

Java Java Java Java Java 4 p * *** ***** *** * Unix p a,b,c,d 100,200,250,500 a*b = a*b+c = a*b+c*d = (a+b)*(c+d) = 225

: CR (0x0d) LF (0x0a) line separator CR Mac LF UNIX CR+LF MS-DOS WINDOWS Japan Advanced Institute of Science and Technology

II ( ) prog8-1.c s1542h017%./prog8-1 1 => 35 Hiroshi 2 => 23 Koji 3 => 67 Satoshi 4 => 87 Junko 5 => 64 Ichiro 6 => 89 Mari 7 => 73 D

tuat1.dvi

ex01.dvi

:30 12:00 I. I VI II. III. IV. a d V. VI

VDM-SL VDM VDM-SL Toolbox VDM++ Toolbox 1 VDM-SL VDM++ Web bool

1 1.1 C 2 1 double a[ ][ ]; 1 3x x3 ( ) malloc() malloc 2 #include <stdio.h> #include

syspro-0405.ppt

2

10/ / /30 3. ( ) 11/ 6 4. UNIX + C socket 11/13 5. ( ) C 11/20 6. http, CGI Perl 11/27 7. ( ) Perl 12/ 4 8. Windows Winsock 12/11 9. JAV


For_Beginners_CAPL.indd

r3.dvi

Transcription:

Haskell 1

2

3

Haskell ( ) 4

Haskell Lisper 5

Haskell = Haskell 6

Haskell Haskell... 7

qsort [8,2,5,1] [1,2,5,8] "Hello, " ++ "world!" "Hello, world!" 1 + 2 div 8 2 (+) 1 2 8 div 2 3 4 map even [1,2,3,4] [False,True,False,True] 8

not. even getline >>= putstrln 9

main = putstrln "Hello, world!" average x y = (x + y) / 2 if collatz n = if even n then n div 2 else n * 3 + 1 subs [] = [[]] subs (x:xs) = yss ++ map (x:) yss where yss = subs xs odd = not. even -- odd n = not (even n) getputline = getline >>= putstrln 10

inp = getline; -- putstrln inp; ( ) getline >>= putstrln -- 11

12

C++ template <typename T> void qsort (T *result, T *list, int n) { if (n == 0) return; T *smallerlist, *largerlist; smallerlist = new T[n]; largerlist = new T[n]; T pivot = list[0]; int numsmaller=0, numlarger=0; for (int i = 1; i < n; i++) if (list[i] < pivot) smallerlist[numsmaller++] = list[i]; else largerlist[numlarger++] = list[i]; qsort(smallerlist,smallerlist,numsmaller); qsort(largerlist,largerlist,numlarger); int pos = 0; for ( int i = 0; i < numsmaller; i++) result[pos++] = smallerlist[i]; result[pos++] = pivot; for ( int i = 0; i < numlarger; i++) result[pos++] = largerlist[i]; delete [] smallerlist; delete [] largerlist; }; 13

Haskell qsort [] = [] qsort (p:ps) = qsort less ++ [p] ++ qsort more where less = filter (<p) ps more = filter (>=p) ps How what ( ) > qsort [8,2,5,1] [1,2,5,8] 14

15

Haskell x = x + 1 16

17

(1) Perl for ($i=0; $i<10; $i++) { print "$i\n"; } mapm_ print [0..9] 18

(2) Perl $i = 0; while (<>) { $i++; } print "$i\n"; Haskell getcontents >>= print. length. lines 19

(3) Perl for ($i = 1; $i <= $n; $i++) { $ret = $ret * $i; } fact 1 = 1 fact n = n * fact (n-1) 20

21

(.) (>>=) Haskell 22

QuickCheck 23

Haskell QuickCheck prop_ordered xs = ordered (qsort xs) where ordered [] = True ordered [x] = True ordered (x:y:xs) = x <= y && ordered (y:xs) > quickcheck prop_ordered OK, passed 100 tests. 24

Haskell 25

PHP Ruby Lisp 型付け動的弱い強い極めて強い C Java Haskell 少ない コンパイラーが発見する間違い多い 多くすべき テストの量 少なくてもよい 26

Haskell 27

isdigit :: Char -> Bool a ) String [Char] (++) :: [a] -> [a] -> [a] a Int, Float, Double (+) :: (Num a) => a -> a -> a a Int, Char, String qsort :: Ord a => [a] -> [a] map :: (a -> b) -> [a] -> [b] IO getline :: IO String putstrln :: String -> IO () 28

if if then else then else collatz :: Int -> Int collatz n = if even n then n div 2 -- Int else n * 3 + 1 -- Int 29

putstrln :: String -> IO () (++) :: [a] -> [a] -> [a] main = putstrln "Hello, " ++ "world!" main = (putstrln "Hello, ") ++ "world!" ++ (++) :: IO() -> [Char] -> [Char] main = putstrln ("Hello, " ++ "world!") 30

31

32

lines :: String -> [String] lines "" = [] lines s = let (l, s ) = break (== \n ) s in l : case s of [] -> [] (_:s ) -> lines s 33

data data Tree a = Leaf a Node (Tree a) (Tree a) data Bool = False True data Maybe a = Nothing Just a IO data IO a =... Haskell Maybe IO 34

Maybe On programming language design http://d.hatena.ne.jp/kmaebashi/20091223/p1#20091223f2 NULL C NULL, Java null, Python None, Lisp nil,... NULL NULL Haskell Maybe data Maybe a = Nothing Just a Just case mx of Nothing -> 0 Just x -> x + 1 maybe 0 (+1) mx 35

IO getline % cat a.hs main = getline >>= putstrln % runghc a.hs foo foo % runghc a.hs bar bar 36

IO IO IO IO main = getcontents >>= \inp -> putstrln (count inp) count :: String -> String count = show. length. lines IO IO IO getline :: IO String putstrln :: String -> IO () main :: IO () main = getline >>= putstrln IO ( ) 37

do do main = do -- :: IO () inp <- getline -- :: IO String putstrln inp -- :: String -> IO () main = getline >>= \inp -> putstrln inp main = getline >>= putstrln do 38

Haskell Haskell Simon PEYTON JONES 39

Parsec 40

Parsec 15 Perl6 Pugs Audrey Tang 41

vs BNF CSV 42

CSV ABNF RFC 4180 file = record *(CRLF record) [CRLF] record = field *(COMMA field) field = (escaped / non-escaped) escaped = DQUOTE *(TEXTDATA / COMMA / CR / LF / 2DQUOTE) DQUOTE non-escaped = *TEXTDATA TEXTDATA = %x20-21 / %x23-2b / %x2d-7e 43

sub parse_csv_line { my $text = shift; my @fields = (); while ($text =~ m/"([^"\\]*(\\.[^"\\]*)*)",? ([^,]+),?,/g) { push(@fields, defined($1)? $1 : defined($3)? $3 : ); } push(@fields, ) if $text =~ m/,$/; return \@fields; } my @csv; while (<>) { chomp; my $ret = parse_csv_line($_); push(@csv, $ret); } 44

Parsec (1) file :: Parser [[String]] file = record sependby1 crlf record :: Parser [String] record = field sepby1 comma field :: Parser String field = escaped < > nonescaped escaped :: Parser String escaped = do dquote txt <- many (textdata < > comma < > cr < > lf < > try (dquote >> dquote)) dquote return txt nonescaped :: Parser String nonescaped = many textdata 45

Parsec (2) textdata :: Parser Char textdata = oneof ("!" ++ [ #.. + ] ++ [ -.. ~ ]) comma :: Parser Char comma = char, crlf :: Parser Char crlf = cr >> lf lf :: Parser Char lf = char \x0a cr :: Parser Char cr = char \x0d dquote :: Parser Char dquote = char " 46

Parser Parser dquote :: Parser Char many :: Parser a -> Parser [a] return :: a -> Parser a escaped :: Parser String escaped = do dquote txt <- many (textdata < > comma < > cr < > lf < > try (dquote >> dquote)) dquote return txt 47

file :: Parser [[String]] file = undefined record :: Parser [String] record = undefined field :: Parser String field = undefined 48

IO >>= 49