SlideShare une entreprise Scribd logo
1  sur  23
F#の流技 Fluent Feature in F# by いげ太 あいさつ。自己紹介。
本田△ 流技といえば本田。無回転シュート。空気の流れを利用。大活躍! ネットでよくこんなのを見た。「本田△」は前へ前へ攻めていく感じ? じゃなく、本田△⇒本田三角形⇒本田さんかっけー⇒本田さんカッコイイ。
OCaml△ ていうか、今日はOCaml Meetingなわけで。 OCamlさんかっけー。 って言いたかったけど、僕はWindowsしか知らないので。
F# △ 似た言語であるF#について話したい。F#は、かんたんにはOCaml.NETです。 ていうか。△似合わない? サッカーならいい。アゲアゲで、敵陣に攻めてる感じ。 プログラミング言語で、上って? ソース コードの上の方? それ後ろ向きじゃん。
F# 前向きにいきましょう。矢印は未来を指してないと。 F#には横向きの三角、というか、矢印がよく似合います。 でもこれ、縦書き文字で無理やり横向きの三角を出してますので。
F# |> こうしましょう。パイプと大なりであらわす。 この横向きの矢印は、F#ではパイプライン演算子と呼ばれます。 パイプライン演算子は、ライブラリ標準の演算子だったりします。
パイプライン演算子 |> h (g (f x)) ↓ x |> f |> g |> h ネストいらずって 素敵やん!? 関数適用のネストをなくして見やすくする演算子。補助的な演算子。 前から順番に、xをfに適用して、その返り値をgに適用して、また その返り値をhに適用して、その結果を得る。わかりやすい!
パイプライン演算子? let (|>) x f = f x let wup n = 2 * n let ans =2 |> wup |> wup |> wup // valans : int = 16 (|>)は、前向きなパイプライン演算子、前方パイプ演算子。 定義はこんな風になっている。ちょっとした例も。ダブルアップで倍々ゲーム。 でもさ、若干だけど、重くなるんじゃない? 無駄じゃない、こんなの?
パイプライン演算子! let inline (|>) x f = f x let wup n = 2 * n let ans = 2 |> wup |> wup |> wup // let ans = wup (wup (wup 2)) // valans : int = 16 (|>)は、実際にはインライン関数(演算子)として定義されています。 インライン展開されるので実行時のコストはゼロ。 気兼ねなく、存分に使ってください。乱用バッチコイ。
後ろから前から h @@ g @@ f @@ x h (g (f x)) x |> f |> g |> h 関数型の 語順 でもさ、関数型コードとの親和性で言えば@@の方がいいんでない?
F#は.NET言語であり、当然OOPの機能を備える。 .NET使いも納得の思考の流れでコードが記述できる。 .NETといえばオブジェクト指向ですよ h @@ g @@ f @@ x x.F().G().H() x |> f |> g |> h OOPの 語順
ところで、F#Teamの一人であるBrianMcNamaraが、 stackoverflowのとあるスレッドでこんなことを書いていました。 要は、ざっくり言うと、前方パイプ演算子は文化だ、と。 前方パイプ演算子は文化だ Brian McNamara writes, “I think (|>) is an important operatorin the F# ‘culture’.” http://stackoverflow.com/questions/1457140/
文化ですってよ。 One more thing One more thing... <censored>
<censored> ドット記法の語順とあわせ打っただけをもって「文化」と言っているわけじゃあない。 だけじゃない One more thing... だけじゃない!! <censored>
F#「OCamlと違うんです」 (* OCaml *) let n = 2 + 3      (* 5 *) let m = 2.0 +. 3.0 (* 5.0 *) // F# let n = 2 + 3      // 5 let m = 2.0 + 3.0  // 5.0 たとえば、.NETには演算子オーバーロードがある。 型推論の完全性を重んじるOCamlとは一線を画す。
オーバーロードと型推論 let func1 x = System.Console.WriteLine(x)// error FS0041     x + 1 let func2 (x: int) = System.Console.WriteLine(x)     x + 1 let func3 x =     let y = x + 1 System.Console.WriteLine(x)     y let func4 x = printfn "%A" x     x + 1 まあ割と型推論と相性が悪いのですけどもー。 型推論ってば、評価時の型環境すべてをひっくるめて見てくれる。 でも、オーバーロード解決は、その場その場で行われる。
F#「.NETですから」 OCamlはStructural Subtyping OCamlにはRow Polymorphismもある F#はNominalSubtyping .NET的に考えてNominalでなきゃマズイ ⇒ F#の型推論は残念!? で、オブジェクト指向の方向性としても、こんな風に違うわけで。 ちょっと難しいので突っ込んで話はしませんが。
デモ > String.length "hoge";; val it : int = 4 > "hoge".Length;; val it : int = 4 > String.length;; val it : (string -> int) = <fun:it@3> > (fun s -> s.Length);;   (fun s -> s.Length);;   ----------^^^^^^^^ stdin(4,11): error FS0072: このプログラムの場所の前方にある情報に基づく不確定の型のオブジェクトに対する参照です。場合によっては、オブジェクトの型を制約する型の注釈がこのプログラムの場所の前に必要です。この操作で参照が解決される可能性があります。 > (fun (s: string) -> s.Length);; val it : string -> int = <fun:clo@5> とりあえず、OCaml的に考えて、どんなふうに残念かってーのをデモで見ます。 ドット記法で書かれたオブジェクトの型は推論されない! 型注釈に頼らざるを得ない。
デモ > let intLength n = -     (fun (s: string) -> s.Length) -         ( (fun n -> n.ToString()) n );; valintLength : 'a -> int > let intLength n = -     (fun (s: string) -> s.Length) -         ( (fun (n: int) -> n.ToString()) n );; valintLength : int -> int > let intLength (n: int) = -     n |> (fun n -> n.ToString()) |> (fun s -> s.Length);; valintLength : int -> int ちょっと意図的な例。それぞれの引数に型注釈付けるのは煩雑極まりない。 なんとかならない? それまでに型が決まればいい。F#の型決定は左から右。 なので、前方パイプ演算子を使えば、残念さをすこしはカバーできるかも!?
まとめ > F# - |> 関数型ベース - |> .NET言語ですが何か - |>OOPは必須です - |> Nominalだし型注釈を免れない ,[object Object]
 ;;val it : culture = だまって前方パイプ書けよ
More Feature 単位系-> 数値に単位を付けて計算 アクティブ パターン        -> パターンとして使用できる関数 オブジェクト式        -> 無名クラス コンピュテーション式        -> モナド イベント ドリブン        -> リアクティブに記述可能 非同期実行        -> 非同期ワークフロー、アクター 他にもおもしろいのいっぱいあるよー。
Reserved as Keywordsfor future expansion http://msdn.microsoft.com/en-us/library/dd233249.aspx わくわくどきどきの将来の機能拡張のための予約語。

Contenu connexe

Tendances

「やっぱり怖かったPerl」In Kichijoji.pm #2
「やっぱり怖かったPerl」In Kichijoji.pm #2「やっぱり怖かったPerl」In Kichijoji.pm #2
「やっぱり怖かったPerl」In Kichijoji.pm #2民人 青山
 
Perlbeginnes 9 lt_ytnobody
Perlbeginnes 9 lt_ytnobodyPerlbeginnes 9 lt_ytnobody
Perlbeginnes 9 lt_ytnobodyazuma satoshi
 
Raspberry pi on java at Java8 Launching Event in Japan
Raspberry pi on java at Java8 Launching Event in JapanRaspberry pi on java at Java8 Launching Event in Japan
Raspberry pi on java at Java8 Launching Event in JapanMasafumi Ohta
 
テーマ「Hokkaido.pmからのお知らせ」
テーマ「Hokkaido.pmからのお知らせ」テーマ「Hokkaido.pmからのお知らせ」
テーマ「Hokkaido.pmからのお知らせ」technocat
 
ジーノ先生の文系的オブジェクト指向(5) - ジーノ先生、殴る
ジーノ先生の文系的オブジェクト指向(5) - ジーノ先生、殴るジーノ先生の文系的オブジェクト指向(5) - ジーノ先生、殴る
ジーノ先生の文系的オブジェクト指向(5) - ジーノ先生、殴るSatoru Kodaira
 
楽しいプログラミング
楽しいプログラミング楽しいプログラミング
楽しいプログラミング明洋 庄司
 
Lt (コピー)
Lt (コピー)Lt (コピー)
Lt (コピー)bitter_fox
 
コンピュテーション式ハンズオン
コンピュテーション式ハンズオンコンピュテーション式ハンズオン
コンピュテーション式ハンズオンssuserb6e6d5
 
20130615 組込みの仕事場でRubyを使う
20130615 組込みの仕事場でRubyを使う20130615 組込みの仕事場でRubyを使う
20130615 組込みの仕事場でRubyを使うRyo Nagai
 
kstm LT (LT ことはじめ)
kstm LT (LT ことはじめ)kstm LT (LT ことはじめ)
kstm LT (LT ことはじめ)Tomona Nanase
 
超要約 Stan Reference
超要約 Stan Reference超要約 Stan Reference
超要約 Stan ReferenceHiroki Mizukami
 
IT業界における伝統芸能の継承 #hachiojipm
IT業界における伝統芸能の継承 #hachiojipmIT業界における伝統芸能の継承 #hachiojipm
IT業界における伝統芸能の継承 #hachiojipm鉄次 尾形
 
RFinanceJはじめました
RFinanceJはじめましたRFinanceJはじめました
RFinanceJはじめましたNagi Teramo
 
シス研下級生向け
シス研下級生向けシス研下級生向け
シス研下級生向けKunisada Ryouta
 
継承やめろマジやめろ。 なぜイケないのか 解説する
継承やめろマジやめろ。 なぜイケないのか 解説する継承やめろマジやめろ。 なぜイケないのか 解説する
継承やめろマジやめろ。 なぜイケないのか 解説するTaishiYamada1
 
業務改善の問題地図 3丁目読書会
業務改善の問題地図 3丁目読書会業務改善の問題地図 3丁目読書会
業務改善の問題地図 3丁目読書会KojiInoue6
 
Rでを作る
Rでを作るRでを作る
Rでを作るNagi Teramo
 
このすこし短い時間にLTを!
このすこし短い時間にLTを!このすこし短い時間にLTを!
このすこし短い時間にLTを!Ryo Iinuma
 

Tendances (19)

Osc2012 hiroshima
Osc2012 hiroshimaOsc2012 hiroshima
Osc2012 hiroshima
 
「やっぱり怖かったPerl」In Kichijoji.pm #2
「やっぱり怖かったPerl」In Kichijoji.pm #2「やっぱり怖かったPerl」In Kichijoji.pm #2
「やっぱり怖かったPerl」In Kichijoji.pm #2
 
Perlbeginnes 9 lt_ytnobody
Perlbeginnes 9 lt_ytnobodyPerlbeginnes 9 lt_ytnobody
Perlbeginnes 9 lt_ytnobody
 
Raspberry pi on java at Java8 Launching Event in Japan
Raspberry pi on java at Java8 Launching Event in JapanRaspberry pi on java at Java8 Launching Event in Japan
Raspberry pi on java at Java8 Launching Event in Japan
 
テーマ「Hokkaido.pmからのお知らせ」
テーマ「Hokkaido.pmからのお知らせ」テーマ「Hokkaido.pmからのお知らせ」
テーマ「Hokkaido.pmからのお知らせ」
 
ジーノ先生の文系的オブジェクト指向(5) - ジーノ先生、殴る
ジーノ先生の文系的オブジェクト指向(5) - ジーノ先生、殴るジーノ先生の文系的オブジェクト指向(5) - ジーノ先生、殴る
ジーノ先生の文系的オブジェクト指向(5) - ジーノ先生、殴る
 
楽しいプログラミング
楽しいプログラミング楽しいプログラミング
楽しいプログラミング
 
Lt (コピー)
Lt (コピー)Lt (コピー)
Lt (コピー)
 
コンピュテーション式ハンズオン
コンピュテーション式ハンズオンコンピュテーション式ハンズオン
コンピュテーション式ハンズオン
 
20130615 組込みの仕事場でRubyを使う
20130615 組込みの仕事場でRubyを使う20130615 組込みの仕事場でRubyを使う
20130615 組込みの仕事場でRubyを使う
 
kstm LT (LT ことはじめ)
kstm LT (LT ことはじめ)kstm LT (LT ことはじめ)
kstm LT (LT ことはじめ)
 
超要約 Stan Reference
超要約 Stan Reference超要約 Stan Reference
超要約 Stan Reference
 
IT業界における伝統芸能の継承 #hachiojipm
IT業界における伝統芸能の継承 #hachiojipmIT業界における伝統芸能の継承 #hachiojipm
IT業界における伝統芸能の継承 #hachiojipm
 
RFinanceJはじめました
RFinanceJはじめましたRFinanceJはじめました
RFinanceJはじめました
 
シス研下級生向け
シス研下級生向けシス研下級生向け
シス研下級生向け
 
継承やめろマジやめろ。 なぜイケないのか 解説する
継承やめろマジやめろ。 なぜイケないのか 解説する継承やめろマジやめろ。 なぜイケないのか 解説する
継承やめろマジやめろ。 なぜイケないのか 解説する
 
業務改善の問題地図 3丁目読書会
業務改善の問題地図 3丁目読書会業務改善の問題地図 3丁目読書会
業務改善の問題地図 3丁目読書会
 
Rでを作る
Rでを作るRでを作る
Rでを作る
 
このすこし短い時間にLTを!
このすこし短い時間にLTを!このすこし短い時間にLTを!
このすこし短い時間にLTを!
 

Fluent Feature in F#