SlideShare uma empresa Scribd logo
1 de 55
Baixar para ler offline
手探りの私にも少しわかる
 気がしてる関数型言語

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

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

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

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

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

     2006/05/17 : 西川による「ゆるーいHaskell」が
                            メルマガにて連載開始
                            (2008/09/03に全23回にて終了)
     2006/12/20 : オブジェクトクラブクリスマスイベントにて
                           徳井進による講演にて、
                           「関数型言語とラムダ計算」が話される
オブラブと関数型言語(2)

     2007/12/21 : オブジェクト倶楽部クリスマスイベントにて
                           オブジェクトの広場さんによる
                           「OO厨厨トレイン 未来編」内で、
                           関数型言語これからくるかもよということ
                           が話される
     2008/09/24 : オブジェクト倶楽部メールマガジン252号にて
                           森田による S式でCocoaプログラムが書ける
                          「Nu」の紹介記事
     2008/10/30 : ファンクショナル倶楽部秋イベント開催
永和と関数型言語
永和と関数型言語

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

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

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

                                ちなみに、僕の好きな関数は、「flip」
あたらしい本(洋書)がでます
RealWorldHaskell

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

     構造として3つしかない簡単な計算モデル
       変数
       関数適用
       関数生成
     詳しくは、2006オブジェクト倶楽部クリスマスイベントの
     「コンピュータよもやま話」の資料を参考
http://www.objectclub.
jp/download/files/event/2006Christmas/session_f_tokui.
pdf
      上記の3つの概念だけで、プログラミングができる
      代入が存在しないので、副作用がおきない
ラムダ式を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
関数がファーストクラス

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

  定番は 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;
 
カリー化

     ある関数の引き数の一部に値を適用させた関数を
     返すようにすること
(+) :: 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
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)) である
モジュール性

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

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

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

         Prelude> wordCount quot;foo Fizz buzzquot;
         3

     ちなみに、(.) 
         Prelude> :t (.)
         (.) :: (b -> c) -> (a -> b) -> a -> c
関数を組み合わせてプログラミング

     問題対象領域を小さくして、小さい関数(部品)を作る
         関数が小さければテストも楽 
     後は、そのブロックを組み合わせていけばいいだけ
         Haskell みたいな静的型言語なら、組み合わせるとき
         のミスをコンパイラが教えてくれる。
         コンパイルが通れば、プログラムが完成
              ただし、コンパイラが通ったからといって、
              正しいプログラムという保証はありません。
              ご了承ください。
まとめると

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

 純粋だから、考えることが少なくなる
   副作用で値がとか考えなくていい 
 型という強い味方がいる
   コンパイル時に関数の組み合わせのエラーを教えてくれる
   先に関数の型を考えることで何が欲しいかを見失わない
   型推論があるので、単純なら定義しなくていい




    ということで、Haskell すごくおすすめ
さらに、Haskellを魅力的にする
  「Arrow」については、
       この後すぐ
最近の関数型言語

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

 完成が待ちに待たれた言語
 Haskell のような動的言語
 JVM で動く言語
完成が待ちに待たれた言語
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/
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;
    120
置き換え計算モデル

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




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

  JVM上で動く Lisp
  Common Lisp と Scheam の中間
  Clojure開発用のelisp , vim のsyntax file, netbeans 用の開発環
  境も整っている
  lambda は fn
  関数のオーバーロードも可能
  並行プログラミングを意識している
  末尾最適化されないので、recur をつかう
Clojure で swing

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

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

Mais conteúdo relacionado

Mais procurados

第11章 電子商務
第11章 電子商務第11章 電子商務
第11章 電子商務Seng Chi Ao
 
2009年4月8日セミナー 2.Sedue新機能
2009年4月8日セミナー 2.Sedue新機能2009年4月8日セミナー 2.Sedue新機能
2009年4月8日セミナー 2.Sedue新機能Preferred Networks
 
Ws Report 080426
Ws Report 080426Ws Report 080426
Ws Report 080426ikiiki
 
CEO-030-平衡計分卡之現在及未來發展方向
CEO-030-平衡計分卡之現在及未來發展方向CEO-030-平衡計分卡之現在及未來發展方向
CEO-030-平衡計分卡之現在及未來發展方向handbook
 
2009年4月8日セミナー 1.オープニング
2009年4月8日セミナー 1.オープニング2009年4月8日セミナー 1.オープニング
2009年4月8日セミナー 1.オープニングPreferred Networks
 
CEO-033-平衡計分卡與策略地圖
CEO-033-平衡計分卡與策略地圖CEO-033-平衡計分卡與策略地圖
CEO-033-平衡計分卡與策略地圖handbook
 
株式会社藤島建設 osm石神の家
株式会社藤島建設 osm石神の家株式会社藤島建設 osm石神の家
株式会社藤島建設 osm石神の家sunseago
 
有錢人想的和你不一樣
有錢人想的和你不一樣有錢人想的和你不一樣
有錢人想的和你不一樣apex.wu
 
知識管理期末報告
知識管理期末報告知識管理期末報告
知識管理期末報告guestabb317
 
結構化程式設計
結構化程式設計結構化程式設計
結構化程式設計David Tang
 
98學年度生涯發展教育實施計畫
98學年度生涯發展教育實施計畫98學年度生涯發展教育實施計畫
98學年度生涯發展教育實施計畫Frank Liu
 
DS-022-螺旋傳動
DS-022-螺旋傳動DS-022-螺旋傳動
DS-022-螺旋傳動handbook
 
心肺復甦術
心肺復甦術 心肺復甦術
心肺復甦術 5045033
 
放款業務之查核(Ppt)
放款業務之查核(Ppt)放款業務之查核(Ppt)
放款業務之查核(Ppt)Dan Liao
 
【12-E-6】 ERP導入の投資対効果 ~SAPの導入事例を元に~
【12-E-6】 ERP導入の投資対効果 ~SAPの導入事例を元に~【12-E-6】 ERP導入の投資対効果 ~SAPの導入事例を元に~
【12-E-6】 ERP導入の投資対効果 ~SAPの導入事例を元に~devsumi2009
 
98學年度生涯發展教育實施計畫
98學年度生涯發展教育實施計畫98學年度生涯發展教育實施計畫
98學年度生涯發展教育實施計畫Frank Liu
 
語文學習領域統整問題疑、議
語文學習領域統整問題疑、議語文學習領域統整問題疑、議
語文學習領域統整問題疑、議winston2744
 

Mais procurados (19)

第11章 電子商務
第11章 電子商務第11章 電子商務
第11章 電子商務
 
2009年4月8日セミナー 2.Sedue新機能
2009年4月8日セミナー 2.Sedue新機能2009年4月8日セミナー 2.Sedue新機能
2009年4月8日セミナー 2.Sedue新機能
 
Ws Report 080426
Ws Report 080426Ws Report 080426
Ws Report 080426
 
立命館WS報告書
立命館WS報告書立命館WS報告書
立命館WS報告書
 
CEO-030-平衡計分卡之現在及未來發展方向
CEO-030-平衡計分卡之現在及未來發展方向CEO-030-平衡計分卡之現在及未來發展方向
CEO-030-平衡計分卡之現在及未來發展方向
 
2009年4月8日セミナー 1.オープニング
2009年4月8日セミナー 1.オープニング2009年4月8日セミナー 1.オープニング
2009年4月8日セミナー 1.オープニング
 
CEO-033-平衡計分卡與策略地圖
CEO-033-平衡計分卡與策略地圖CEO-033-平衡計分卡與策略地圖
CEO-033-平衡計分卡與策略地圖
 
株式会社藤島建設 osm石神の家
株式会社藤島建設 osm石神の家株式会社藤島建設 osm石神の家
株式会社藤島建設 osm石神の家
 
有錢人想的和你不一樣
有錢人想的和你不一樣有錢人想的和你不一樣
有錢人想的和你不一樣
 
知識管理期末報告
知識管理期末報告知識管理期末報告
知識管理期末報告
 
結構化程式設計
結構化程式設計結構化程式設計
結構化程式設計
 
98學年度生涯發展教育實施計畫
98學年度生涯發展教育實施計畫98學年度生涯發展教育實施計畫
98學年度生涯發展教育實施計畫
 
DS-022-螺旋傳動
DS-022-螺旋傳動DS-022-螺旋傳動
DS-022-螺旋傳動
 
PFI会社案内
PFI会社案内PFI会社案内
PFI会社案内
 
心肺復甦術
心肺復甦術 心肺復甦術
心肺復甦術
 
放款業務之查核(Ppt)
放款業務之查核(Ppt)放款業務之查核(Ppt)
放款業務之查核(Ppt)
 
【12-E-6】 ERP導入の投資対効果 ~SAPの導入事例を元に~
【12-E-6】 ERP導入の投資対効果 ~SAPの導入事例を元に~【12-E-6】 ERP導入の投資対効果 ~SAPの導入事例を元に~
【12-E-6】 ERP導入の投資対効果 ~SAPの導入事例を元に~
 
98學年度生涯發展教育實施計畫
98學年度生涯發展教育實施計畫98學年度生涯發展教育實施計畫
98學年度生涯發展教育實施計畫
 
語文學習領域統整問題疑、議
語文學習領域統整問題疑、議語文學習領域統整問題疑、議
語文學習領域統整問題疑、議
 

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