Your SlideShare is downloading. ×
  • Like
Haskell
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply
Published

テストアップロード

テストアップロード

Published in Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
945
On SlideShare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
2
Comments
0
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide
  • 対話環境では let で副作用のない変数を作れる .
  • λ 計算はチューリングマシンより前の話 1936 年の手続き的なチューリングマシンも数学者チューリングの生み出した数学的概念である . それは , 無限に長いテープとその中に格納された情報を読み書きするヘッドと機械の内部状態を記憶するメモリを持つ . また , ヘッドの位置をテープに書き込むこと機械の内部状態を変えることヘッドを左右に一つ動かすことができる . ISWIM の実装はない MIRANDA の祖先はパターンマッチとかガードとかを持つ言語
  • 単位元 x*1 = x 1*x=x => 左から x を掛ける x*1*x = x*x => 右から x の逆元を掛ける . x*1*x*x^-1=x*x*x^-1 結合法則より右側を優先して演算可能 (x*x^-1)=1 x*1*1=x*1 一番右を計算 x*1 = x できた!
  • チューリング完全は , 宣言的に可能な計算はどんな計算もできるという意味だと思う .
  • 必要になるまでの条件は最外簡約で決まる. 全てのプログラムの変換を行えるわけではないと思われる.
  • カリー化があると,コンパイルエラーの表示が分かりにくくなるという弱点もあるかも.
  • 1文字の変数を使っていいのは1行+αの場合だけ.複数行(変数)の場合はもっと長くした方が良い. Test ...x... みたいにxを間違って打つと何だか分からないことになるし誤動作の元である.
  • ooのようなclass treeを遡らない. 型推論の件は, オブジェクト指向だとClass1.getxとClass2.getxが型が同じとは限らないからか. プログラミング言語のソースコードは 簡単な問題がエレガントに解かれていて初心者の勉強に役立つ.
  • Object指向のCascadeは遅いし,若干醜いし,2項演算に難があるかもしれない.
  • 高速性が必要なければ,配列等は変更の度に新しいのに変えればよい.

Transcript

  • 1. 純粋関数型言語 Haskell入門 (社内勉強会) @todorokit
  • 2. Haskellについて
      Haskellは 純粋関数型言語 の中では 最先端かつメインストリームの言語である. λ 計算 の子孫であり , 参照透明性 を持つ.
        その他にも遅延評価 , 型推論 , Curry化, 型クラス等多くの機能を持つ.
      参照透明ではあるが,副作用をIOモナドで行える.
  • 3. 簡単な紹介
      GHC という Haskell処理系を使う ## コンパイル # ghc a.hs # --makeってやると依存関係が楽 ## バッチ実行 # runhaskell a.hs # runghcでも可 ## 対話実行 # ghci
  • 4. 簡単な紹介
       x = 3* 5 ^2 +13 -- 普通に計算 88  add = x y -> x + y -- 匿名関数  -- Mirandaやその祖先よりパターンマッチを導入  mysum [] = 0  mysum (x:xs) = x+ mysum xs -- 再帰的定義
  • 5. 簡単な紹介
       -- 同様にGuardを導入  abs x | x >= 0 = x   | otherwise = negate x  -- 高階関数 遅延リスト  evens = filter even [0..] -- [0,2,4,6...]  evens10 = take 3 evens -- [0,2,4]
  • 6. 簡単な紹介
       -- curry化.showは1引数を取り文字列にする  str123 = concat (map show [1,2,3])  -- 2項演算子も curry化される  myproduct list = foldl (*) 1 list  evens = [ x | x <- [0..] , even x] -- 内包表現
  • 7. 簡単な紹介
       -- 構造体  data Rgb = Red | Green | Blue blue = Blue   data Pair a = Null | Atom a | Cons (Pair a) (Pair a)  pari1 = Cons (Atom 1) Null
  • 8. 簡単な紹介
       -- 多相(多態)  instance (Show a)=>Show (Pair a) where   show Null = “Null” show (Atom a)= “Atom ” ++show a   show (Cons a b) =“(”++show a ++ “,”++ show b++ “)”
  • 9. 関数型の歴史
    • 1930年代:λ計算はλ式による具体的・汎用的計算を行える数学的概念.
    • 10. 1958年:Lispがλ計算ができる最初の言語.
    • 11. 1966年:ISWIMという純粋関数型言語ができる.
    • 12. 1974年:ML言語は型推論を持つ関数型言語.
    • 13. 1985年:Mirandaという多機能な純粋関数型言語がHaskellの直接の祖先.
    • 14. … Wikipediaに詳しく載ってます.
  • 15. 純粋関数型言語 純粋関数型言語とは とは数学的な関数の評価を行い , 状態やデータの変更を行わない プログラミングパラダイムを採用した言語である . ルーツは λ 計算であり 匿名関数 を持つ .
  • 16. 数学的関数とは
      等号 で結ばれた式の 変換が可能 . 群を例に! 以下 a,b,c,e,g は集合 G の要素 . * は 2 項演算子で以下を満たす .
    • 結合法則 a*(b*c)=(a*b)*c を満たす .
    • 17. 単位元 G の全ての要素 g に g*e=g となる e がある .(x*1=x)
    • 18. 逆元 g*a=e となる a が存在する .(x*x^-1=1)
    • 19. ここから掛算の 1*x = x を導出可能である .
  • 20. λ計算
        λ 計算とは 匿名関数のみで計算する概念 . ループは Y-combinator で定義でき , If 文は遅延関数のみで実現可能であり チューリング完全である .
  • 21. 関数型言語
      関数型言語ではその特性上, 頻繁に使用されるデータ構造も手続き型と違う. シーケンス的なデータ構造(配列等)にはList(LinkList)が用いられる.
  • 22. 型推論
      Haskellでは 静的な型を 持つが, 関連する情報から型を推論し 多くの部分では省略できる .
    また,静的型よりコンパイル時に型エラーを発見でき, 実行速度は高速である.
      関数は関数を引数に取れて複雑な型となるが. Haskellではそれも推論可能である.
  • 23. 参照透明性(1)
      関数の引数が決まれば戻り値が決まる特性 . (「数学的関数とは」と同じ事である) プログラムの構造を規則 ( 等号 ) によって変換できる . ( 例 ) : map (+1) (map (*2) x) = map (a->2*a+1) x プログラムの変換で 極限まで無駄を省くと , 必要になるまで評価しない 遅延評価になる . 基本的にデータ構造も遅延的な特性を持つ .
  • 24. 参照透明性(2)
      値の変更ができないため, 他の言語に良くあるループの構造は存在しない. その代わりに再帰を使って実現する. 再帰であってもループと等価であれば, コンパイラがループに変換可能である. let var1 = 1 in let var1 = 2 in var1*2 -- => 4 のように同名の新しい変数を定義すれば, 通常の代入でやりたいことができる場合も多い.
  • 25.
      Curry化
      2以上の引数を持つ関数を 1引数の関数を階層化した形で表現すること. func x y = value => y -> (x -> value) 0引数の関数は定数と同じで,あとは1引数の関数しかないので言語は簡略化し,部分適用も簡単に行える.プログラムの変換が可能だから効率は悪くない. (+1) = ( y -> (x -> x + y)) 1 = (y -> y + 1)
  • 26. 型クラス(1)
      以下サンプルコード infix 4 ==, /= -- infix は 2 項演算子の定義 . 4 の部分は高い程優先される -- * は 6 で (+) は 5 なので 2*3+1 == 7 は True になる -- True == True == True はエラー , infixr とか infixl なら ok data Int = MakeInt IntInC -- C で書かれた Int 型
  • 27. 型クラス(2)
      class Eq a where (==), (/=) :: a -> a -> Bool x /= y = not (x == y) x == y = not (x /= y) -- javaのinterfaceに近いが厳密な型ではない. instance Eq Int where (==) = inteq
  • 28. 型クラス(3)
      -- java の interface より (Eq a) という依存関係の定義が勝る class (Eq a) => Ord a where compare :: a -> a -> Ordering (<), (<=), (>), (>=) :: a -> a -> Bool max, min :: a -> a -> a …
  • 29. 型クラス(4)
    • Mirandaとの違いはこの機能である.
    • 30. 普通のOOP(Subtyping)で型推論を行っても
    • 31. メソッドを一意に決定できないらしい.
    • 32. 行列等を作る場合,2項演算子を使用して拡張できる.
    • 33. Int等基礎となる型もこれで定義されていて,
    • 34. ソースを読んでも面白かったりする.
  • 35. IOモナド(1)
      >>=, >>, return, fail を含む Monad 型クラスで Global 環境を持ち運びながら計算を行う . Global 環境は毎回変化し違う値のはずなので , 参照透明であっても IO 関数に対する プログラムの変換 (Graph 簡約等 ) が行われない . >> や >>= によって IO 関数の計算の順番も決定する .
  • 36. IOモナド(2)
      -- randomの例だがIO変数の変更等も可能 import System.Random main = do randval <- getStdRandom (randomR (1,100)) putStr (show (randval ::Int))
  • 37. おまけ 関数合成
      f.g = x -> f (g x) -- 定義 -- 例 map (*2) . map (+1) y -> map (*2) (map (+1) y) -- 2引数関数でも可能 (all . any) even [[1,2],[3,4]] -- True (all . any) = f -> x -> all (y -> any f y) x
  • 38. おまけ Parser Combinator
      Parser(構文解析器)を関数の合成で表現する. parse (try (string &quot;(a)&quot;) <|> string &quot;(b)&quot;) &quot;&quot; &quot;(b)&quot; パーザは型さえ合えば何段もネスト可能であり, 匿名関数を使用した機能もある等 柔軟かつ高機能である. 速度も比較的速い(最近もっと速いやつもあるらしい)
  • 39. 終わりに
      プログラミングパラダイムが違い 全く違う概念で構築された言語がたくさんあります. 特にHaskellの周りには 興味深いものがいっぱいあります. Have fun!