手探りの私にも少しわかる
 気がしてる関数型言語

     三村 益隆
  永和システムマネジメント
アジェンダ

 自己紹介
 オブラブとファンラブ
 関数型言語の特徴
 関数型言語の紹介
自己紹介

    Name : 三村 益隆
    所属   : 株式会社永和システムマネジメント
                 サービスプロバイディング事業部4G
                  旧 コア技術事業部
    勤務地:...
旧コア技術事業部とは
旧コア技術事業部とは
旧コア技術事業部とは
旧コア技術事業部とは
旧コア技術事業部とは

 JAVA, Ruby , ゆるふわとは、ご縁がございません
 C でかりかり、カーネル空間でのお仕事
 UML って、User Mode Linux だよね ?
福井
ファンクショナル倶楽部
ファンクショナル倶楽部とは

 オブジェクト倶楽部に紛れ込んでいた、関数型言語好きが集まっ
 てできた倶楽部
オブラブと関数型言語
オブラブと関数型言語(1)

     2006/05/17 : 西川による「ゆるーいHaskell」が
                            メルマガにて連載開始
                            (2...
オブラブと関数型言語(2)

     2007/12/21 : オブジェクト倶楽部クリスマスイベントにて
                           オブジェクトの広場さんによる
                          ...
永和と関数型言語
永和と関数型言語

「ふつうのHaskell」写経会
ラムダ計算勉強会
社内Erlang勉強会(継続中)
eval/apply勉強会
新人研修の一部にラムダ計算を教える
関数型言語の特徴   

 ラムダ計算がベース
 関数がファーストクラス
 高いモジュール性
関数型の特徴をHaskellで
    説明
ご、ご存じないのですか?
純粋関数型言語 Haskell を
Haskell のご紹介

  純粋関数型言語
   副作用がない
  遅延評価
   値が必要とされるまで計算されない
  静的型であり、型推論をもつ
  パターンマッチがつかえる 
  モナド
   純粋であるために、「副作用」を再発明

...
あたらしい本(洋書)がでます
RealWorldHaskell

 学術的なプログラミングだけではなく、実践的な部分にも言及
   GUI, ネットワークプログラミング
 表紙は、14の言葉のひとつであるカブトムシ
   ヘラクレスオオカブト
 10月発売予定でしたが、11...
ラムダ計算
ラムダ計算がベース

     構造として3つしかない簡単な計算モデル
       変数
       関数適用
       関数生成
     詳しくは、2006オブジェクト倶楽部クリスマスイベントの
     「コンピュータよもやま話」...
ラムダ式をHaskellで

     関数生成
     Prelude> let add = (x -> (y -> x + y))
     add :: Integer -> Integer -> Integer
     関数適用
 ...
関数がファーストクラス

 「関数」を 引き数や返り値にすることができる
   高階関数
     関数を受け取る関数
     関数の引数の一部を適用した関数を返す関数
関数を受け取る関数

  定番は map 
   渡されたリストの各要素に引数にきた関数を適用 
       Prelude> :t map
       map :: (a -> b) -> [a] -> [b]
     渡されたリストに...
カリー化

     ある関数の引き数の一部に値を適用させた関数を
     返すようにすること
(+) :: Num (a) => a -> a -> a 
       inc :: Num (a) => a -> a
       inc...
Haskell の引数を2つ以上とる関数

     実は、引数を2つ以上とる関数は高階関数
      Prelude> :t (+)
      (+) :: (Num a) => a -> a -> a
      Prelude> :t...
モジュール性

 関数一つ一つが部品となり、ブロックを組み合わす感覚で、プロ
 グラムを構築できる
文字列中の単語を数える

文字列を空白区切りでわけた配列を返す関数
 words :: String -> [ String ]
配列の長さを数える関数
 length :: [ a ] -> Int
文字列中の単語を数える

      ( . ) を使い合体 ( 関数合成 )
         wordCount :: String -> Int
         wordCount = length . words

         ...
関数を組み合わせてプログラミング

     問題対象領域を小さくして、小さい関数(部品)を作る
         関数が小さければテストも楽 
     後は、そのブロックを組み合わせていけばいいだけ
         Haskell みたい...
まとめると

 ラムダ計算ベースだから、関数の適用のみで計算されるため、副
 作用に悩まずプログラムが書ける
 関数がファーストクラスのため、関数そのものを部品として扱うこと
 ができる
 モジュール性が高いので、やりたい処理の関数を組み合わせ...
Haskell だと

 純粋だから、考えることが少なくなる
   副作用で値がとか考えなくていい 
 型という強い味方がいる
   コンパイル時に関数の組み合わせのエラーを教えてくれる
   先に関数の型を考えることで何が欲しいかを見失わない...
さらに、Haskellを魅力的にする
  「Arrow」については、
       この後すぐ
最近の関数型言語

- この先が見えない言語探し編 -
きっとキミも気に入る関数型言語

 完成が待ちに待たれた言語
 Haskell のような動的言語
 JVM で動く言語
完成が待ちに待たれた言語
Arc  - http://arclanguage.org/ -

     みんな大好きポール・グレアムの作った                      新
     しい Lisp 方言
         「ハッカーと画家」にてペーパーウ...
Arc の人気 
Arc の特徴    

 今まで長くわかりづらかった表現が短くかける
   lambda => fun
   defun   => def
 Ascii しか扱えない
   文字コードに悩まされるなら、言語のチカラを
   作りたい
Haskellのような動的言語
Haskell のような動的言語
Pure -http://code.google.com/p/pure-lang/-

  見た目はだいたいHaskell
  動的言語
  置き換えベースの評価方式
  LLVM
  C で書かれた関数を容易に呼ぶことができる
見た目がだいたいHaskell

   pure で階乗計算

    > fact 1 = 1;
    > fact n = n * fact (n - 1);
    > fact 1;
    1
    > fact 5;
    1...
置き換え計算モデル

   変数を置き換え可能なところまで、評価していく
       > two = x + y;
       > two ;
        x+y
       > x = 1;
       > two ;
     ...
JVM で動く言語
JVM で動く関数型言語




     http://clojure.org
Clojure  - http://clojure.org/ -

  JVM上で動く Lisp
  Common Lisp と Scheam の中間
  Clojure開発用のelisp , vim のsyntax file, netbean...
Clojure で swing

     JVMで動くので、簡単に Java のライブラリが使用可能
      (.  javax.swing.JOptionPane  (showMessageDialog
nil             ...
PragmaticBookshelf 
選択の目安に

ポール・グレアム大好きな、あなた
  Arc
LLVM や C で拡張書くことにも興味がある
  Pure
JVM の整った環境で使いたい
  Clojure
この冬、あなた好みの
関数型言語をみつけて
 始めてみませんか?
ご静聴ありがとうございました
  Have a nice day!!
Upcoming SlideShare
Loading in …5
×

手探りの私にもわかる気がしている関数型言語

5,778
-1

Published on

0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
5,778
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
20
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

手探りの私にもわかる気がしている関数型言語

  1. 1. 手探りの私にも少しわかる 気がしてる関数型言語 三村 益隆 永和システムマネジメント
  2. 2. アジェンダ 自己紹介 オブラブとファンラブ 関数型言語の特徴 関数型言語の紹介
  3. 3. 自己紹介 Name : 三村 益隆 所属   : 株式会社永和システムマネジメント                  サービスプロバイディング事業部4G                   旧 コア技術事業部 勤務地: 福井
  4. 4. 旧コア技術事業部とは
  5. 5. 旧コア技術事業部とは
  6. 6. 旧コア技術事業部とは
  7. 7. 旧コア技術事業部とは
  8. 8. 旧コア技術事業部とは JAVA, Ruby , ゆるふわとは、ご縁がございません C でかりかり、カーネル空間でのお仕事 UML って、User Mode Linux だよね ?
  9. 9. 福井
  10. 10. ファンクショナル倶楽部
  11. 11. ファンクショナル倶楽部とは オブジェクト倶楽部に紛れ込んでいた、関数型言語好きが集まっ てできた倶楽部
  12. 12. オブラブと関数型言語
  13. 13. オブラブと関数型言語(1) 2006/05/17 : 西川による「ゆるーいHaskell」が                             メルマガにて連載開始                             (2008/09/03に全23回にて終了) 2006/12/20 : オブジェクトクラブクリスマスイベントにて                            徳井進による講演にて、                            「関数型言語とラムダ計算」が話される
  14. 14. オブラブと関数型言語(2) 2007/12/21 : オブジェクト倶楽部クリスマスイベントにて                            オブジェクトの広場さんによる                            「OO厨厨トレイン 未来編」内で、                            関数型言語これからくるかもよということ                            が話される 2008/09/24 : オブジェクト倶楽部メールマガジン252号にて                            森田による S式でCocoaプログラムが書ける                           「Nu」の紹介記事 2008/10/30 : ファンクショナル倶楽部秋イベント開催
  15. 15. 永和と関数型言語
  16. 16. 永和と関数型言語 「ふつうのHaskell」写経会 ラムダ計算勉強会 社内Erlang勉強会(継続中) eval/apply勉強会 新人研修の一部にラムダ計算を教える
  17. 17. 関数型言語の特徴    ラムダ計算がベース 関数がファーストクラス 高いモジュール性
  18. 18. 関数型の特徴をHaskellで 説明
  19. 19. ご、ご存じないのですか? 純粋関数型言語 Haskell を
  20. 20. Haskell のご紹介 純粋関数型言語 副作用がない 遅延評価 値が必要とされるまで計算されない 静的型であり、型推論をもつ パターンマッチがつかえる  モナド 純粋であるために、「副作用」を再発明                                 ちなみに、僕の好きな関数は、「flip」
  21. 21. あたらしい本(洋書)がでます
  22. 22. RealWorldHaskell 学術的なプログラミングだけではなく、実践的な部分にも言及 GUI, ネットワークプログラミング 表紙は、14の言葉のひとつであるカブトムシ ヘラクレスオオカブト 10月発売予定でしたが、11月発売と遅延発売される
  23. 23. ラムダ計算
  24. 24. ラムダ計算がベース 構造として3つしかない簡単な計算モデル 変数 関数適用 関数生成 詳しくは、2006オブジェクト倶楽部クリスマスイベントの      「コンピュータよもやま話」の資料を参考 http://www.objectclub. jp/download/files/event/2006Christmas/session_f_tokui. pdf 上記の3つの概念だけで、プログラミングができる 代入が存在しないので、副作用がおきない
  25. 25. ラムダ式をHaskellで 関数生成      Prelude> let add = (x -> (y -> x + y))      add :: Integer -> Integer -> Integer 関数適用      Prelude> (x -> (y -> x + y)) 1 3      4     Prelude> let func = (x -> (x -> x * 2 ) $ x + 2)      func :: Integer -> Integer     Prelude> func 10     24
  26. 26. 関数がファーストクラス 「関数」を 引き数や返り値にすることができる 高階関数 関数を受け取る関数 関数の引数の一部を適用した関数を返す関数
  27. 27. 関数を受け取る関数 定番は map  渡されたリストの各要素に引数にきた関数を適用         Prelude> :t map        map :: (a -> b) -> [a] -> [b] 渡されたリストに対して、何もしない            Prelude> map id [1 .. 10]            [1,2,3,4,5,6,7,8,9,10]  渡された数値リストの要素を対応する文字に変換            Prelude Char> map  chr  [97..122]            quot;abcdefghijklmnopqrstuvwxyzquot;  
  28. 28. カリー化 ある関数の引き数の一部に値を適用させた関数を      返すようにすること (+) :: Num (a) => a -> a -> a         inc :: Num (a) => a -> a        inc a = 1 + a             =>  inc = (+) 1 (*) ::  Num (a) => a-> a -> a        twice :: Num (a) => a -> a        twice a = 2 * a              => twice = (*) 2
  29. 29. Haskell の引数を2つ以上とる関数 実は、引数を2つ以上とる関数は高階関数       Prelude> :t (+)       (+) :: (Num a) => a -> a -> a       Prelude> :t (+) 1       (+) 1 :: (Num t) => t -> t  (+) は   a と a を受け取って a を返す関数( (a -> a) -> a ) ではなく    a を受け取って、a を受け取って a を返す関数を返す関数    (a -> ( a -> a)) である
  30. 30. モジュール性 関数一つ一つが部品となり、ブロックを組み合わす感覚で、プロ グラムを構築できる
  31. 31. 文字列中の単語を数える 文字列を空白区切りでわけた配列を返す関数 words :: String -> [ String ] 配列の長さを数える関数 length :: [ a ] -> Int
  32. 32. 文字列中の単語を数える  ( . ) を使い合体 ( 関数合成 )          wordCount :: String -> Int          wordCount = length . words          Prelude> wordCount quot;foo Fizz buzzquot;          3 ちなみに、(.)           Prelude> :t (.)          (.) :: (b -> c) -> (a -> b) -> a -> c
  33. 33. 関数を組み合わせてプログラミング 問題対象領域を小さくして、小さい関数(部品)を作る 関数が小さければテストも楽  後は、そのブロックを組み合わせていけばいいだけ Haskell みたいな静的型言語なら、組み合わせるとき のミスをコンパイラが教えてくれる。 コンパイルが通れば、プログラムが完成 ただし、コンパイラが通ったからといって、               正しいプログラムという保証はありません。               ご了承ください。
  34. 34. まとめると ラムダ計算ベースだから、関数の適用のみで計算されるため、副 作用に悩まずプログラムが書ける 関数がファーストクラスのため、関数そのものを部品として扱うこと ができる モジュール性が高いので、やりたい処理の関数を組み合わせる ことでプログラムができている
  35. 35. Haskell だと 純粋だから、考えることが少なくなる 副作用で値がとか考えなくていい  型という強い味方がいる コンパイル時に関数の組み合わせのエラーを教えてくれる 先に関数の型を考えることで何が欲しいかを見失わない 型推論があるので、単純なら定義しなくていい ということで、Haskell すごくおすすめ
  36. 36. さらに、Haskellを魅力的にする 「Arrow」については、 この後すぐ
  37. 37. 最近の関数型言語 - この先が見えない言語探し編 -
  38. 38. きっとキミも気に入る関数型言語 完成が待ちに待たれた言語 Haskell のような動的言語 JVM で動く言語
  39. 39. 完成が待ちに待たれた言語
  40. 40. Arc  - http://arclanguage.org/ - みんな大好きポール・グレアムの作った                      新 しい Lisp 方言 「ハッカーと画家」にてペーパーウェアとして紹介 2008 年 01 月 29 にリリース Mzscheam v352 で実装されている プログラムをいかに手早く短くかくかを目的として設計 quot;it's a quick and dirty language for writing quick and dirty programs.quot; Hacker News は arc で書かれている                        http://news.ycombinator.com/
  41. 41. Arc の人気 
  42. 42. Arc の特徴     今まで長くわかりづらかった表現が短くかける lambda => fun defun   => def Ascii しか扱えない 文字コードに悩まされるなら、言語のチカラを 作りたい
  43. 43. Haskellのような動的言語
  44. 44. Haskell のような動的言語
  45. 45. Pure -http://code.google.com/p/pure-lang/- 見た目はだいたいHaskell 動的言語 置き換えベースの評価方式 LLVM C で書かれた関数を容易に呼ぶことができる
  46. 46. 見た目がだいたいHaskell pure で階乗計算 > fact 1 = 1; > fact n = n * fact (n - 1); > fact 1; 1 > fact 5; 120
  47. 47. 置き換え計算モデル 変数を置き換え可能なところまで、評価していく        > two = x + y;        > two ;         x+y        > x = 1;        > two ;         1+y        > y = 1 ;        > two ;         2
  48. 48. JVM で動く言語
  49. 49. JVM で動く関数型言語 http://clojure.org
  50. 50. Clojure  - http://clojure.org/ - JVM上で動く Lisp Common Lisp と Scheam の中間 Clojure開発用のelisp , vim のsyntax file, netbeans 用の開発環 境も整っている lambda は fn 関数のオーバーロードも可能 並行プログラミングを意識している 末尾最適化されないので、recur をつかう
  51. 51. Clojure で swing JVMで動くので、簡単に Java のライブラリが使用可能       (.  javax.swing.JOptionPane  (showMessageDialog nil                                                                              quot;Hello Worldquot;))
  52. 52. PragmaticBookshelf 
  53. 53. 選択の目安に ポール・グレアム大好きな、あなた Arc LLVM や C で拡張書くことにも興味がある Pure JVM の整った環境で使いたい Clojure
  54. 54. この冬、あなた好みの 関数型言語をみつけて 始めてみませんか?
  55. 55. ご静聴ありがとうございました Have a nice day!!

×