2006-09-23から1日間の記事一覧

二章のまとめ

関数 putStr cs putStrLn cs print x length xs take n xs reverse xs lines cs unlines ss words cs アクション getContents

tail

main = do cs <- getContents putStr $ lastNLines 10 cs lastNLines n cs = unlines $ takeLast n $ lines cs takeLast n ss = reverse $ take n $ reverse ss : reverse xs

head

main = do cs <- getContents putStr $ firstNLines 10 cs firstNLines n cs = unlines $ take n $ lines cs 関数定義 関数名 [仮引数列] = 本体 : take n xs , unlines ss

lines/unlines と words/unwords

ghciにて。 Prelude> lines "hoge\nhoge\n\nhoge" ["hoge","hoge","","hoge"] Prelude> unlines ["hoge","hoge","","hoge"] "hoge\nhoge\n\nhoge\n" lines は改行文字を取り除く unlines は最後の要素を含め、全て末尾に改行文字をつける Prelude> words " a…

変数名の慣習

整数n - 整数のリストns 文字c - 文字のリストcs (=文字列)

countline

main = do cs <- getContents print $ length $ lines cs $は左括弧を表す。右結合。 "hoge $ ..." == "hoge (...)" : print x , length xs , lines cs

List

全要素の型は揃っている必要がある OCamlも同様。SchemeやRubyだと(静的な型付けを行わないので)バラバラでも可 文字列=文字のリスト

cat

{- Haskell -} main = do cs <- getContents putStr cs do 式を束ねる。上から順に実行。 オフサイドルール Pythonのようにインデントが意味を持つ " getContentsアクションの結果入力された文字列に変数を束縛する。 : getContents , putStr cs (* OCaml *)…

Hello, World!

{- Haskell -} main = putStrLn "Hello, World!" 変数mainを定義 アクションは、評価することで副作用を起こす。 Haskellプログラム実行 = main変数の評価 : putStrLn cs (* OCaml *) let _ = print_endline "Hello, World!" 見た目は殆ど一対一に対応する

環境

処理系 ghc (コンパイラ) -o 出力ファイル名 runghc (インタプリタ) ghci (対話) ":q" quit ":?" help Emacs haskell-mode C-c C-l で現在のバッファをロードしてghciを実行

Haskellの長所

柔軟 高階関数とか 型チェック 多相型とか 読みやすい 代入がない 遅延評価

勉強日記

しばらく"ふつうのHaskellプログラミング"を読んで淡々とログを垂れ流していこうと思います。 OCaml や Scheme や Ruby や PHP や Java や C と比較したりしなかったりしつつ。ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門作者:…