Javaの関数型プログラミング: コレクションの使用 - Oracle...java.util.function.Predicate関数インタフェースの参照を受け取ることになっています。つま
最新C#動向と関数型言語haskell...
-
Upload
fujio-kojima -
Category
Technology
-
view
339 -
download
3
description
Transcript of 最新C#動向と関数型言語haskell...
最新 C# 動向と関数型言語Haskell
~命令型 / 静的プログラミングから関数型プログラミングへのシフト~ 十月二三日
(
金
)
日直
小島
富治雄
FITEA 最新技術ミニセミナー
自己紹介
2
小島 富治雄 (Fujiwo)
・ FITEA・ Microsoft MVP for Development Tools - Visual C#
3
マイブーム
自転車通勤“bicycle commute”
ジャグリング“juggling”
英語の勉強“learning English”
アジェンダ
マルチパラダイム !
関数型プログラミング !
C# vs. Haskell!
マルチパラダイム !
プログラミング言語のトレンド
マルチパラダイム
マルチパラダイム関数型
⇔ 手続き型⇔ オブジェクト指向型
宣言型 ⇔ 命令型
動的型無し⇔ 静的型付き
Generic
並列プログラミング9
( 噂によると、マルチパラダイムな言語として、
“ Scala ”というのが
いけてるらしい。 )
背景マルチパラダイム
プログラミングが現実的に。• C# など言語の進化• Visual Studio などツールの進化
C# は、最新のものほど、マルチパラダイム
プログラミング言語化
C# の進化
C#1.0C#2.0
C#3.0C#4.0
オブジェクト指向 !
ジェネリック !
宣言型 !関数型 !
動的 !並列処理 !
並列プログラミング
14
ムーアの法則の破れ
15
「今から 10 年後、 15 年後に、
われわれは極めて根本的な問題に直面する」
2007/09/18
「半導体に集積される
トランジスタの数は18 ~ 24 カ月ごとに
倍増する」ムーアの法則 1965
ゴードン・ムーア( インテルの共同創業者 )
マルチコア CPU
16
プログラマはどうすればいいか
17
James Hughes 氏( サン マイクロシステムズ副社長 )
マルチ スレッディングを有効に活用するための並列プログラミング
技術が必要2008/12/03
宣言型プログラミング
“What” を記述⇔ 命令型プログラミング
•“How” を記述 (C# 2 .0 以前など )
各のパラダイムの限界手続き型の限界オブジェクト指向の限界
→ 適材適所のパラダイム
→ マルチパラダイム 19
Q. パラダイムによってソースコードは大きく変わる ?
デモ命令型・オブジェクト指向型•例 . “OOP アンケート”
宣言型・関数型•例 . “FP アンケート”
まったく同じ実行結果だが…
美しさが異なる
保守性が異なる•変更容易性•テスト容易性
別の例
アセンブリ言語mov dx, msg
mov ah, 0x09
int 0x21
xor al, al
mov ah, 0x4C
int 0x21
msg db "Hello World!$"
を、なんで
C#class Program
{
static void Main()
{
System.Console.WriteLine("Hello World!");
}
}
printfn "Hello world!"
F#
のように書くようになってきたの
か ?
「動けばいい」のなら、どっちでも良いはず。
何の違いがソースコードの違いを
生むのか ?
ソースコードが異なる
↑プログラマーが意図したモデル
が異なる。
モデル( =関心のある / コミュニケーショ
ンしたい部分を抽出したもの )
の記述により近いものが使われる。
私の認識
プログラミングというのは、実装のみを行う
のではない。
プログラミングは、
「設計+実装+テスト」。
プログラミングというのは、「検証可能な
設計 / 実装モデル」を作ること。
プログラミングという行為は
モデリング。
モデリングなので、
モデリングのための言語・ツールが重要。
プログラミング言語が重要
モデルを書くのに適した言語•進化した C# など
「プログラミングで作られるモデル」
=ソースコード( が理想 )
モデルとはそのコンテキストでの関心事を抽出したもの。
モデルの目的 :
•関心事に限定した
コミュニケーション。
誰とのコミュニケーション ?
ソースコードで誰とコミュニケーションするのか ?
古くは :
• コンピュータとコミュニケーション
時代が進んで :
• コンパイラとコミュニケーション
今は :
• 人とコミュニケーション
• 人 = ステークホルダー
プログラミングでは :Q. 何をモデリングするのか ?
=何を関心事として抽出するか ?
A. 意図をモデリング。
意図がソースコード ( =モデル )で表現されるべき。
例
例えば…C# では、
「従業員名簿内の 全ての各従業員を画面に出力する」
のソースコードは、
従業員名簿.ForAll(各従業員 => 各従業員.出力(画面));
と書かれたりする。宣言型プログラミング
なんで従業員名簿.ForAll(各従業員 => 各従業員.出力(画面));
このソースコードが、
for (int i = 0; i < 従業員名簿.Count; i++)
出力(従業員名簿[i]);
より良いか?
命令型プログラミング
「この場合は」、「整数 i を 0 にし、 i が 従業員名簿の Count までの間、 i をインクリメントしながら、従業員名簿の i 番目を出力」
という意図のモデルじゃなく、
「従業員名簿内の全ての各従業員を
画面に出力する」
のモデルだから。
つまり、「従業員名簿内の全ての各従業員を
画面に出力する」
のモデルとしては、
従業員名簿 .ForAll( 各従業員 => 各従業員 . 出力 (画面 ));
の方が (ベストではないが ) ベター。
もし仮に、 「整数 i を 0 にし、 i が 従業員名簿の Count までの間、
i をインクリメントしながら、従業員名簿の i 番目を出力」
という意図のモデルだったら、
for (int i = 0; i < 従業員名簿 .Count; i++)
出力 (従業員名簿 [i]);
の方が、ベター。
よりピュアなモデルが書けている方がベター。
モデルがピュアであることが重要か ?
そう。モデルはピュアであることが重要。
なぜならば、
モデルとは
「関心事を抽出したもの」
だから。
例えば…「従業員名簿内の 全ての各従業員を画面に出力する」
が意図なら、 for (int i = 0; i < 従業員リスト .Count; i++)
出力 (従業員リスト [i]);
の場合、
「 int 」、「 i 」、「 = 」、「 < 」、「 Count 」、「 i++ 」、「 [i] 」
は「意図以外」のもの。
( =モデルにとっては「ノイズ」 )
「この場合は」、 for (int i = 0; i < 従業員リスト.Count; i++)
出力(従業員リスト[i]);
よりは、
従業員リスト.ForAll(各従業員 => 各従業員.出力(画面));
の方がノイズが少ない。(=SN比が高い)
宣言型プログラミング
命令型プログラミング
どんな風にプログラミング
したいか
57
どんな風にプログラミングしたいか
シンプルに書きたいことだけを書く•モデル記述( モデル = 関心事が分離されたもの )
58
どんな風にプログラミングしたいか
CPU に指示するようでなく
コンパイラに指示するようでなく
人が人に話すように59
そのためには
状況に適したパラダイムの採用手続き型プログラミング
⇔ オブジェクト指向型プログラミング⇔ 関数型プログラミング
命令型プログラミング⇔ 宣言型プログラミング
テキスト型プログラミング⇔ 図解型プログラミング
ジェネリック・プログラミング並列プログラミングなどの組み合わせ
関数型プログラミング !
関数型言語純粋 ハイブリッド
静的型付け Haskell Scala
動的型付け Scheme
C#
OCamlF#
ErlangLISP
関数型プログラミング宣言的数学的
関数型プログラミングプログラムは関数の集まり⇔ 手続きの集まり
⇔ オブジェクトの集まり
関数型プログラミング関数脳が必要 ?
⇔ 手続き脳
⇔ オブジェクト脳
見える化してみた
Haskell の脳内
関数関数
関数関数
関数
関数
関数
関数
関数
関数
関数関数
関数
関数
関数
C# の脳内
関数 関数
物 手続
物物物
物物物物
物物物
物
物
手続手続手続
物物
関数
物物物
物
より分かりやすく見える化
Haskellたん
C# たん
関数型プログラミング代入文がない•副作用がない•状態を持たない
関数型プログラミング参照透明•実行順序を気にしなくてよい•副作用がないので、いつどの式を評価しても同じ•制御フローがない
C# vs. Haskell!
C# vs. Haskell
C# は Haskell に近づけたのか ?
C#
マイクロソフト社によって同社の .NET戦略の一環として開発されたオブジェクト指向プログラミング言語
Haskell
純粋関数型言語。名前は、米国の数学者 Haskell B. Curry に由来。
Haskell遅延評価強い静的型付け
型推論
静的多相型付け
高階関数
参照透過性
再帰的関数
副作用がない
パターンマッチング
カリー化
Haskell『ふつうの Haskellプログラミングふつうのプログラマのための関数型言語入門』392ページ
ソフトバンククリエイティブ
2006/06/01
Haskell『 Real World Haskell― 実戦で学ぶ関数型言語プログラミング』720ページ
オライリージャパン
2009/10/26
第一試合 .
再帰的関数
お題「階乗」•サンプル“ Factorial”
第二 試合 .
パターンマッチング
そのままサンプル“ Factorial”
第三 試合 .
遅延評価
お題「無限長のリストを扱う」•サンプル“ YieldSample”
第三 試合 .
遅延評価
お題「一から十まで 足す」•サンプル“ Sum”
第四試合 .
宣言的プログラミング
お題「クイックソート」•サンプル“ QuickSort”
5 3 8 2 9 1 6 4 7
53 2 1 4
8 9 6 7
32 1 4
1 2
86 7
9
6 7
参考 : クイックソート
ご清聴ありがとうございました