Contenu connexe
Similaire à Haskell超入門 Part.1 (20)
Haskell超入門 Part.1
- 5. Haskell は高階関数や静的多相型付け、定義可
能な演算子、例外処理といった多くの言語で採
用されている現代的な機能に加え、パターン
マッチングやカリー化、リスト内包表記、ガー
ドといった多くの特徴的な機能を持っている。
また、遅延評価や再帰的な関数や代数的データ
型もサポートしているほか、独自の概念として
圏論のアイデアを利用し参照透過性を壊すこと
なく副作用のある操作(例えば 代入、入出力、
配列など)を実現するモナドを含む。
(by Wikipedia)
- 7. ちょっとだけ詳しく言うと
純粋関数型
プログラミング言語
です。
- 8. 手続き型言語
› 記述された命令を逐次実行していく。
› 一般的に用いられる言語。
関数型言語
› すべての計算は関数の評価で行われる。
› 変数が無く、定数しか無い。
› 手続き型でのループは再帰で実現する他、
様々な機能が別の形で実現されている。
- 9. その他の種類について興味のある方は
「プログラミングパラダイム」という
キーワードで調べると良いでしょう。
- 10. 基本的に副作用が無いため、
原因不明のバグが出ることが少ない。
どういう物が必要かを記述していけば
書けてしまうので、短時間での開発が可能。
- 11. クイックソートの例
qsort [] = []
qsort (x:xs) = qsort smaller ++ [x] ++ qsort larger
where
smaller = [a | a <- xs, a <= x]
larger = [b | b <- xs, b > x]
非常に簡潔に記述出来る。
- 12. 代表的なもの
› 再帰関数(自分自身を呼び出す関数)
› λ式(ラムダ式、無名関数)
› 無限リスト(長さが無限のデータ)
› 遅延評価 (必要な時まで式を評価しない)
› 高階関数(関数の引数または返り値が関数)
› 純粋 (基本的に副作用が無い)
› モナド(副作用を扱う仕組み)
他多数!
- 13. Haskellが使用されているプロジェクト
› Pugs
HaskellによるPerl6の実装
› darcs
分散バージョン管理システム
› Whitespace
タブ・空白・改行のみで記述する言語
› Monadius
グラディウス風のゲーム
› Mighttpd (発音:Mighty)
HTTPサーバ
- 14. 基本的な文法をいくつか覚える。
簡単なプログラムを書けるように
なれれば素敵。
- 15. GHC (Glasgow Haskell Compiler)
Haskellにおける事実上の標準コンパイラ。
実行が高速で、ライブラリ多数。
Hugs
軽量なコンパイラ、基礎を学ぶには十分。
導入も簡単だが開発は停止している模様。
Haskell Platform
Haskell処理系のGHCに加えて
各種ツールやライブラリが揃っている。
- 16. UNIXであれば
GHCか、可能であればHaskell Platformを。
Windowsであれば
Haskell Platformが最適。
高度な事をするのであれば、
UNIXならGCC
WindowsならMinGW
などが必要。
- 17. 今回はGHCに付属する
› コンパイラのGHC
› インタプリタのGHCI
を使用します。
環境がある方は挑戦してみましょう。
- 18. まずはインタプリタから
実行してみます。
- 19. Win/UNIXならghci、MinGWならghcii.shを起動します。
$ ghci
GHCi, version 7.0.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.
Loading package ffi-1.0 ... linking ... done.
Prelude>
Prelude(標準ライブラリ)が出てくれば準備完了です。
:quit または :q で終了します。
Prelude> :q
Leaving GHCi.
$
- 23. 関数は :info で見ると色々情報が出ます。
(:i と略せる)
> :info (+)
class (Eq a, Show a) => Num a where
(+) :: a -> a -> a
...
-- Defined in GHC.Num
infixl 6 +
- 27. リストは色々な操作が可能です。
> [1,2,3,4,5] !! 2
3
> take 3 [1,2,3,4,5]
[1,2,3]
> drop 3 [1,2,3,4,5]
[4,5]
> reverse [1,2,3,4,5]
[5,4,3,2,1]
- 28. 長さも変更可能です。
> length [1,2,3,4,5]
5
> length (tail [1,2,3,4,5])
4
> [1,2,3] ++ [4,5]
[1,2,3,4,5]
- 33. 長さを変えられない代わりに、
違う型でも使えます。
> (1,‟a‟)
(1,‟a‟)
> (1,”Hello”)
(1,”Hello”)
> (1,'a',"hello",[1,2,3])
(1,'a',"hello",[1,2,3])
- 37. Prelude> take 3 [1,2,3,4,5]
[1,2,3]
2引数の関数です。
リストから指定した数の要素を
取り出します。
2つ以上の引数に対して関数適用する場合も
空白文字を使います。
- 40. $ ghci
Prelude> let main = putStrLn “Hello, World!”
等式の左辺が関数名、
右辺は関数の内容になります。
let 関数名=関数の内容
という形式です。
- 43. 以下の行をhello.hsというファイルに
保存します。
main = putStrLn “Hello, World!”
関数名=関数の内容という形式です。
先程と同様に等式の左辺が関数名、
右辺は関数の内容になります。
こちらが一般的な書き方です。
先ほどのletはインタプリタ用と考えてください。
- 44. hello.hsをコマンドラインから
コンパイルして実行してみます。
$ ghc --make hello.hs
$ ./hello
Hello, World!
$
実行できました。
- 49. コンパイルして実行する場合
› 高速に実行できる
› 実行するにはmainを定義する必要がある
インタプリタで実行する場合
› 便利な機能が沢山あるので
学習する時に非常に便利
› mainを定義しなくても良い
- 51. 先程のhello.hsを読み込む。
> :load hello.hs
> main
Hello, World!
- 52. GHCIを起動したまま、
別ウィンドウでhello.hsを編集する。
$ cat hello.hs
main = putStrLn “Hello, World!”
$ #編集
$ cat hello.hs
main = putStrLn “Hello, Haskell!”
- 54. GHCIのウィンドウに戻り、
再読み込み。そして実行。
> :load hello.hs
> main
Hello, World!
> :reload
> main
Hello, Haskell!
- 56. あとは :type や :info など。
調べるのに便利な機能が色々あります。
- 58. 1引数の関数を見てみる
headを見てみる
> head [1,2,3]
1
> :t head
head :: [a] -> a
- 71. head :: [Num] -> Num
headは[Num] -> Num型
数値のリスト型から数値型へと
変換する関数
- 72. head :: [Num] -> Num
headは[Num] -> Num型
数値のリスト型から数値型へと
変換する関数
本当にそうなのか確認。
- 76. 1引数の関数を見てみる(2)
sumを見てみる
> sum [1,2,3,4,5]
15
> :t sum
sum :: Num a => [a] -> a
- 86. 2引数の関数を見てみる(1)
takeを見てみる
> take 3 [1,2,3,4,5]
[1,2,3]
> :t take
take :: Int -> [a] -> [a]
- 95. take :: Int -> ([a] -> [a])
Int型を受け取り
([a]型を受け取り
[a]型を返す関数)
を返す関数
- 96. take :: Int -> [a] -> [a]
Int型を受け取り
[a]型を受け取り
[a]型を返す関数
を返す関数
- 97. take :: Int -> [a] -> [a]
Int型を受け取り
[a]型を受け取り
[a]型を返す関数
を返す関数
言い換えると
- 98. take :: Int -> [a] -> [a]
Int型と[a]型を受け取り
[a]型を返す関数
という事です
- 99. 非常に分かりづらいので
順を追って解読してみる。
- 114. > take 2 [4,5,6]
Int型 [a]型
[4,5]
[a]型
- 115. > take 2 [4,5,6]
Int型 [a]型
[4,5]
[a]型
どうやら本当になったようです。
- 116. 実際にGHCIでも確認してみましょう。
- 117. > :t take
take :: Int -> [a] -> [a]
> :t take 2
take 2 :: [a] -> [a]
> :t take 2 [4,5,6]
take 2 [4,5,6] :: Num a => [a]
> take 2 [4,5,6]
[4,5]
- 119. 少々かみ砕きすぎたでしょうか。
余計難しくなったかも知れません。
一言で説明しても順を追って説明しても
難解な概念ですが、何度かソースを書いて
試して見ると、急にすっと分かるように
なります。
- 121. 全体的に駆け足で説明する事に
なってしまいました。
Haskellが分かるようになると
いつの間にか面白いと思うようになります。
ありがとうございました。