1度#nowarnしちゃうと、その行以下のファイル全体に対して影響が及んでしまう(イケていない)ので。ファイル内で再び警告を有効化できるように対応してもらいたいですね(はよ!)。↓このあたりの話ですね。こんな感じのアクティブパターンでがんばります?になるのかな。諸兄の中で不完全なパターンマッチを絶対コロスマンの人ってどのくらいいるのでしょう。以下のような感じにコンパイルオプションでこの警告をコンパイルエラーに設定してる人のことです。listで最初に渡ってくるヤツがソレなので。Quotations.Expr.Coerceを用いて強制的に適切な型にキャストしてあげればよいです。この方法で生成しようとしている型のインスタンスに対してコネコネ操作することができます。Microsoft.CSharp.CSharpCodeProviderを使用して、IsValidIdentifier(有効な識別子かどうか)など厳密にチェックするような実装を検討してもいいかもしれません。parameterをすべて省略したときのやり方のやーつ静的パラメータありのTypeProviderで、すべての静的パラメータを省略できることをサポートするためには、渡されるすべてのProvidedStaticParameterについて、省略された場合の既定値を設定しておいてあげればよいです。GTWSP2.Method_省略されたよ()という感じで、静的パラメータをすべて省略可能なTypeProviderを作ることもできますのでご活用ください。お役立ち情報ではないうえ、知ってた速報!かもしれませんが。コンストラクタで呼び出すには、ProvidedConstructorのBaseConstructorCallでよしなに処理してあげればよいです。[top])とゆー感じで書けるます。プロパティーを生やす場合の実装方法として、返却する値はリフレクションを使ってプロパティに突っこんでおけばええやん!説が、私の中では割と正義だったのですが。onlyなプロパティで返してあげるように実装してあげる方がキレイなのかな。思い直している今日この頃です。力強くリフレクションで済ませてしまう方が実装楽ではあります(雑にそう書いてもバチはあたらないでしょう!)。把握してうまく活用することで、TypeProviderでできることの幅がぐんと広がるかと思います。↓を参照してください。(F#)少しだけ例を紹介しようかなとも思いましたが、長くなるので雑にリンクだけ貼っておきます(読めば察せると思いますので!)。これがサポートされると...、もうやりたい放題!!ですね。消去型のTypeProviderにおいてはまったく意識する必要はないのですが、生成型のTypeProviderでは意識すべき内容です。HogeTypeProvider<"Piyo">上記のように1つのTypeProviderを用いて複数の異なる型を生成する。こんな当たり前(そう)なことが、生成型のTypePrpviderにおいては、そうできるように実装を考慮をしていないと実現できません。考慮せずに実装した場合は、たとえばおおよそ以下のような感じのエラーが出てしまい、ほげーーーっと剥げてしまいます。例外がスローされました。1このようなエラーを回避するには、TypeProviderの各ルートタイプに対して個別の一時アセンブリを作成してあげる必要があります。この考慮が割と忘れがちになります(TypeProvider実装考慮漏れあるある)。生成型のTypeProviderを作るときのお決まりのパターンというか、ある種嗜みのようなものかなと思いますので、覚えておいて損はないかと思います。やり方については以下を参照してもらえればよいかと思います。ファイルを参照してくれない件についてTypeProviderが参照するDLLからConfigurationManagerを使用してapp.configから情報を取得しようとした場合、われわれが期待するapp.configを参照してくれないことがある!とゆ-残念無念な問題があります。configファイルを対象として動作してしまうのが原因です(どーしよーもない)。devenv.exe(VisualSudio)からみたconfigは、われわれが期待するソレではなく、以下のようないわゆるVisualStudioの在り処にあるconfigファイルを対象に動作します(これはひどい罠)。14.0\Common7\IDE\devenv.exe.configTypeProviderから参照されるDLLからConfigurationManagerを用いて、適切にわれわれが期待するapp.configを読み込みたいケースでは、なんらかの方法で対象のPathをConfigurationManagerに直接指定せざるを得ないです。この問題にぶちあたるケースの方がよっぽどレアケース説!がありすぎて。誰の役にも立たない情報かもしれません。Mavnn(@mavnn)さんがまとめてくださっているので、くわしくはそちらをご参照ください!(THE丸投げ)。Providersとかなんとか何やら興味深い記述が。リポジトリにある以下の3つのファイルを追加すれば利用できるとのこと。ProvidedTypesContext.fsこれ、実はPaketやNuGetを介して最新版を取得しても、まったく降ってこないんですよね。気づきにくい(!)軽い気持ちでコードを読もうとしても黒魔術すぎてわたしのような雑魚にはぶっちゃけわけわかめ(難しい)なんですが、AssemblyReader.fsは軽量.NETアセンブリリーダー、AssemblyReaderReflection.fsはディスク上のアセンブリに対するリフレクションオブジェクトの実装。ProvidedTypesContext.fsは、mscorlibまたはSystem.RuntimeのDLLが見つからないような環境下において、軽量.NETアセンブリリーダーを使用してよしなにCross-Targeting対応してくれるやーつみたいな感じなのかな。これの使い方自体は簡単で。ProvidedTypesContext.Create(config)そのコンテキスト経由で各種Providedほげもげを生成してTypeProviderを構成していけばよいみたいです。typeof<obj>)実装構成によっては割と面倒くさいことになり兼ねない感じがプンプンします(が、そんなときはReaderモナドとかでうまいこと乗り切ってください(察し))以下あたりも読んでおきましょうかね。Providersということで、とりとめもなくTypeProviderに関する小ネタをいくつか書いてみました。時間切れ)たところで終わります。あとで書くかものやつは、書かない可能性が高そうですが大目に見てください(誰かが書いてくれてもいい)。ところで、TypeProviderは、弊社次期タイトル「黒騎士と白の魔王」でもガチで使用されています。リリースされましたら、そのあたりにも注目してみてください(まったく表に出てきませんので注目のしようがありませんが!)。どのように使われているのかについてお話する機会が持てるかどうかはわかりませんが。その時は面白い話もできるかもしれません。書きましたが、何かひとつでも参考になれば幸いです。ありがとうございました。FSharp」というタイトルで発表させていただいたのですが、時間配分がうまくいかずにスライドの最後まで紹介することができませんでした。申し訳ありません(はずかしい)。」とお約束をしていたので、こちらにまとめます。使用したスライドをそのまま公開することも考えましたが、それだと内容が伝わりにくくてあまり価値がなさそうかなと思ったのと、変な誤解をされる恐れもあると考えたので、発表時に話した内容に簡単な補足を加えたり、ときにはざっくり省いたりしたかたちでこちらにまとめることにしました。時間オーバーしただけあってだいぶ長いです(ポエム)。セッションを聞いていただいたかたは、続きのみどうぞ@mayukiさんが作ってくれた画像。別に殺伐とはしていなかったはず。言語遍歴としてはVB(レガシー的なのも含む)、C#、Java、あとはDelphiあたり。その他いろいろさわってますが、よく知られている(一般的な)オブジェクト指向言語をつかって仕事をしていることが多かったです。関数型言語関連の研究をしていたとか、数学が得意だとかでもなく一般の人。C#の会社に所属していながら、F#の話をする。インストールしてくれています。今後使ってくれる)かどうかはわかりませんが。こちらのツイートをみたとき、まゆきさんツンデレだなあと思いました。Games)のF#実装。XML、SXML、FSB(独自形式)の3種類の外部DSLを備えていることです。NuGetである程度DLされているんだけど、使ってみたという話を一度も聞いたことないですね。・UniFSharpUnityエディタ上からMSBuildを実行してF#をビルドするやつ。ScriptをインスペクターにD&Dできたりします。あと、無駄にUnityちゃんがしゃべります。サポートされるようになる日は、まずこなさそうですね。F#に対して「無関心」だった人に関心をもってもらいたい。F#に対してもともと「関心」があった人をより協力者に近づけたい。流行らせたい?単純に良いと思うものは広めたいし。語り合える仲間が増えるのはうれしいよね!というのは当然として、ユーザーが少ないことは問題でしかないと考えるからですね。実際ユーザが少なくてイイことなどまるでないので。開発者が少ないということは、ライブラリやフレームワークの選択肢の幅も狭くなります。書籍も出版されにくいし、Web上でも情報が少なく何かトラブルがあったときに困る可能性があります。んなもんで、ビジネスにも適用されにくくなります。Language)的なアプローチを使った言語設計で研究することが決定したのが2002年らしいので、F#1.0に至るまで約3年かかったということになるのかな。ためのジェネリック機構を作った人。Provider(型プロバイダー)などの新しい(面白い)試みがある。Pattern,(アクティブパターン)なんてのもある。簡単に言うとユーザ指定形式のパターンマッチ。最新版のF#4.0は、3.0からの大きな機能拡張はなくて割と地味な印象がある。細かなバグの修正だったり手触り感の向上があって普通に便利になりました。Studioでインストールされなくなりましたが。他には、毛色が違うけどリアクティブプログラミングもパラダイムのひとつと言って差支えないかな。F#は関数プログラミングに主軸を置いたマルチパラダイム言語です。実用レベルで使用できる関数プログラミングのパラダイムをサポートしている唯一の言語。それ以上でもそれ以下でもないです。C#(VB)はオブジェクト指向プログラミングを主体としたマルチパラダイム言語。いっても、C#(VB)のそれは関数プログラミングを支援している関数型プログラミング言語に比べて、ごくごく限られていて。C#(VB)でできるプログラミングのパラダイムの1つに関数プログラミングを加えるは、ちょっと違うかなと(個人的に)は思うところです。LINQ使用時のラムダ式の利用など関数プログラミングのエッセンスが効果的にとりいれていて、それはオブジェクト指向プログラミングとも非常になじんでいます。Monoがあることによって、いろんなところで動くよ他には、GPUとかブラウザ上とか。さまざまな環境で動くF#さんFsharpbindingプロジェクトってのがあってですね・・・いろんなエディタいろんな環境でつかえるよ。Studio(現時点ではおそらく最強)。拡張機能の充実ぶりがすばらしいので。#いい世の中になりましたC#で作られたライブラリも利用可能、とは言ったものの、F#から使いやすいC#ライブラリとして設計されていないと、だいぶツライ感は否めないですけど。Toolsの機能をいくつか紹介しました。フォルダをきって、階層構造をつくれるようになるのはふつうにうれしい。サンスクリット語でして、日本語(仏教用語)だと般若です。関数型言語っぽさに比例しているかなあと、個人的には考えます。最近のプログラミング言語は、マルチパラダイム化(というか、関数プログラミングの一部の要素が取り入れられる)が進んでいてその境界が割と曖昧になってきている。言語(コンパイラ)や開発環境でどの程度支援されているか(推奨されているか)どうかで、関数型言語と呼んで差支えがないかどうか判断をする感じかなあ。オブジェクト指向プログラミング言語は、オブジェクト指向プログラミングがなんたるかを教えてくれない。かなりのぶぶんで言語そのものから関数プログラミングのスタイルを学ぶことができる。ある面では学習コストは高いけど、そういった面で考えると、頭の中がまっさらならむしろ学習コスト低いのかななんて。理解するのに時間がかかるような難しい理論や概念ももちろんありますが、大部分が誤解かと思います。関数型言語を使って関数プログラミングを学ぶ、その入り口自体には難しい要素はほとんどなく、シンプルかつ堅牢なルールが重んじられる(ことが多い)ので複雑性が少なくなって、むしろ簡単とさえ感じる部分もあるくらいです。少なくとも、可変な値に翻弄される複雑性を減らすことができるので、書きたいプログラムそのものに集中できる時間が増える。いうことは実際に利用してみると実感できるはずです。言語によっては大きくシンタックスが異なる場合があるので、ある程度の抵抗感が生まれてしまうのは事実(しょーがない)。F#も「見た目がきもくて無理」なんて言われることもある。好んで使っているひとは「美しい」って言う人多いのに。(いい意味で)いろいろとゆるいので。みゅーたぶるな値も使い放題だし、手続き的だったりオブジェクト指向なスタイルを残しつつ、少しずつ関数プログラミングのスタイルを取り入れていくことが無理なくできるのではないかな。いう素敵サイトの記事から引用したものですfsharpforfunandprofit.com重要なところも割とさっくりと大胆に省略されていたりしますが、まあイサギヨサがある。コードを見たことがない人も多いのでは?ということで入れました。やるつもりでいたんですが、ここにかなりの時間を費やしてしまったので時間切れになってしまった。リストは、順序が指定されていて変更不可の一連の同じ型の要素を表します。リストを定義するには、セミコロンで要素を区切って角かっこで囲む感じ。単一要素とリストの結合はコロン2つで。リスト同士の結合は@で。キーワードを使用しません。常に関数内の最後の式が返される。最初こそ少しとっつきにくいかもしれないが、シンプルなルールなのですぐに慣れることができるだろうし、実際明確でわかりやすい。Listモジュールに定義されているので、よしなに使う。List.filterはLINQでいうところのWhereのこと。1から100までのリストについて、正方形の面積を求めてその和をだす(なんのために)関数に適用される引数を明確にするためには括弧を用います。この例に関していうと、括弧を書かないとコンパイルが通らないので。正確には前方パイプライン演算子F#ではコードを書きやすく、また見通し良くするためのパイプライン演算子が標準で提供されている。すると楽しい気分を演出するかもしれないし、しないかもしれない完全に一致(ではない)が、似ている。F#ではループの代わりとして利用できる高階関数が数多く提供されている。ループしようと思ったら再帰関数書かなきゃだめなの!?みたいな変な誤解は持たないでほしい。ループ用の構文を必要としない場面が多いということはわかってもらえるはず。LINQの場合は当然、あらかじめ定義されている拡張メソッドなりがある場合のみにメソッドチェーンとして処理を手続き的に書き下すことができる。それに対してパイプライン演算子によるチェーンでは、型さえ合えば自由に関数をチェーンできる。後ろになんでも繋げられることをメリットととらえるか、はたまたデメリットととらえるか。これは、開発のスタイルや重視するプログラミングパラダイムによって意見が変わってくるところだろうと思う。おいては、パイプライン演算子によって後続の処理を好きなだけ連ねることができるのはメリットでしかない。3年前のツイートだったわたしはこれでF#覚えました。これは別に冗談で言っているのではなく結構本気で。(|>)パイプライン演算子という中置演算子を用いることで、関数と引数の順序を逆にすることができる。これによって、関数適用の流れを手続き型的に書き下すことができるので、処理の流れがわかりやすくなります。F#ではこの「パイプライン演算子を使う」ことが基本でありながら、同時に最上級のプラクティスであると言っても過言ではなく。これを好んでよく使うことはおのずとF#の上達に繋がります。複数の値を組みにするやつ。雑に言うと、フィールド名を持たない無名クラスのようなものSystem.Tuple.Create<,>とか書かなくてよいし、Item1,Item2...と付き合わなくてもよいという話。タプル扱いやすく改善されないかなぁと思っているはず。