Fluent Feature in F#

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

Recommended

C#erがF#に這い寄ってみた by
C#erがF#に這い寄ってみたC#erがF#に這い寄ってみた
C#erがF#に這い寄ってみたHiroshi Maekawa
4.3K views65 slides
F#の基礎(?) by
F#の基礎(?)F#の基礎(?)
F#の基礎(?)bleis tift
3.3K views48 slides
解説?FSharp.Quotations.Compiler by
解説?FSharp.Quotations.Compiler解説?FSharp.Quotations.Compiler
解説?FSharp.Quotations.Compilerbleis tift
2.3K views39 slides
コードゴルフのススメ(C言語) by
コードゴルフのススメ(C言語)コードゴルフのススメ(C言語)
コードゴルフのススメ(C言語)Fumihito Yokoyama
2.5K views15 slides
札幌F#勉強会とは何だったのか by
札幌F#勉強会とは何だったのか札幌F#勉強会とは何だったのか
札幌F#勉強会とは何だったのかKenta USAMI
1.7K views25 slides
20170114 lod challenge by
20170114 lod challenge20170114 lod challenge
20170114 lod challengezuhitoslide
523 views2 slides

More Related Content

What's hot

Osc2012 hiroshima by
Osc2012 hiroshimaOsc2012 hiroshima
Osc2012 hiroshimaAkira Kaneda
403 views32 slides
「やっぱり怖かったPerl」In Kichijoji.pm #2 by
「やっぱり怖かったPerl」In Kichijoji.pm #2「やっぱり怖かったPerl」In Kichijoji.pm #2
「やっぱり怖かったPerl」In Kichijoji.pm #2民人 青山
1.3K views20 slides
Perlbeginnes 9 lt_ytnobody by
Perlbeginnes 9 lt_ytnobodyPerlbeginnes 9 lt_ytnobody
Perlbeginnes 9 lt_ytnobodyazuma satoshi
1.3K views39 slides
Raspberry pi on java at Java8 Launching Event in Japan by
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
1K views33 slides
テーマ「Hokkaido.pmからのお知らせ」 by
テーマ「Hokkaido.pmからのお知らせ」テーマ「Hokkaido.pmからのお知らせ」
テーマ「Hokkaido.pmからのお知らせ」technocat
382 views19 slides
ジーノ先生の文系的オブジェクト指向(5) - ジーノ先生、殴る by
ジーノ先生の文系的オブジェクト指向(5) - ジーノ先生、殴るジーノ先生の文系的オブジェクト指向(5) - ジーノ先生、殴る
ジーノ先生の文系的オブジェクト指向(5) - ジーノ先生、殴るSatoru Kodaira
312 views8 slides

What's hot(19)

「やっぱり怖かったPerl」In Kichijoji.pm #2 by 民人 青山
「やっぱり怖かったPerl」In Kichijoji.pm #2「やっぱり怖かったPerl」In Kichijoji.pm #2
「やっぱり怖かったPerl」In Kichijoji.pm #2
民人 青山1.3K views
Perlbeginnes 9 lt_ytnobody by azuma satoshi
Perlbeginnes 9 lt_ytnobodyPerlbeginnes 9 lt_ytnobody
Perlbeginnes 9 lt_ytnobody
azuma satoshi1.3K views
Raspberry pi on java at Java8 Launching Event in Japan by Masafumi Ohta
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
Masafumi Ohta1K views
テーマ「Hokkaido.pmからのお知らせ」 by technocat
テーマ「Hokkaido.pmからのお知らせ」テーマ「Hokkaido.pmからのお知らせ」
テーマ「Hokkaido.pmからのお知らせ」
technocat382 views
ジーノ先生の文系的オブジェクト指向(5) - ジーノ先生、殴る by Satoru Kodaira
ジーノ先生の文系的オブジェクト指向(5) - ジーノ先生、殴るジーノ先生の文系的オブジェクト指向(5) - ジーノ先生、殴る
ジーノ先生の文系的オブジェクト指向(5) - ジーノ先生、殴る
Satoru Kodaira312 views
楽しいプログラミング by 明洋 庄司
楽しいプログラミング楽しいプログラミング
楽しいプログラミング
明洋 庄司1K views
Lt (コピー) by bitter_fox
Lt (コピー)Lt (コピー)
Lt (コピー)
bitter_fox735 views
コンピュテーション式ハンズオン by ssuserb6e6d5
コンピュテーション式ハンズオンコンピュテーション式ハンズオン
コンピュテーション式ハンズオン
ssuserb6e6d5174 views
20130615 組込みの仕事場でRubyを使う by Ryo Nagai
20130615 組込みの仕事場でRubyを使う20130615 組込みの仕事場でRubyを使う
20130615 組込みの仕事場でRubyを使う
Ryo Nagai2.3K views
kstm LT (LT ことはじめ) by Tomona Nanase
kstm LT (LT ことはじめ)kstm LT (LT ことはじめ)
kstm LT (LT ことはじめ)
Tomona Nanase772 views
IT業界における伝統芸能の継承 #hachiojipm by 鉄次 尾形
IT業界における伝統芸能の継承 #hachiojipmIT業界における伝統芸能の継承 #hachiojipm
IT業界における伝統芸能の継承 #hachiojipm
鉄次 尾形2.3K views
RFinanceJはじめました by Nagi Teramo
RFinanceJはじめましたRFinanceJはじめました
RFinanceJはじめました
Nagi Teramo5.2K views
継承やめろマジやめろ。 なぜイケないのか 解説する by TaishiYamada1
継承やめろマジやめろ。 なぜイケないのか 解説する継承やめろマジやめろ。 なぜイケないのか 解説する
継承やめろマジやめろ。 なぜイケないのか 解説する
TaishiYamada1768 views
業務改善の問題地図 3丁目読書会 by KojiInoue6
業務改善の問題地図 3丁目読書会業務改善の問題地図 3丁目読書会
業務改善の問題地図 3丁目読書会
KojiInoue69 views
Rでを作る by Nagi Teramo
Rでを作るRでを作る
Rでを作る
Nagi Teramo3.6K views
このすこし短い時間にLTを! by Ryo Iinuma
このすこし短い時間にLTを!このすこし短い時間にLTを!
このすこし短い時間にLTを!
Ryo Iinuma1.1K views

Fluent Feature in F#

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.