型プロバイダー(Type Provider)のとりとめもない話
だらだらと型プロバイダー(Type Provider)のとりとめもない話。ほとんど内容はないよう。
型プロバイダーって何?
F#3.0 から利用できる目玉機能のひとつ。 これが発表されたとき、「LINQ + Type Providers = Information Rich Programming」なんて言われていました。 「インフォメーションリッチプログラミングから LINQ を引いて残った物が 型プロバイダーだよ。」「わけがわからないよ。」
任意のメタデータを与えると、コンパイラがコンパイル時に"型のないもの"に"型を与えて"提供してくれる。それが型プロバイダー。これ、Visual Studio や Xamarin(MonoDevelop) 等のIDEとも連携するということでメシウマ状態必至なわけ。
type Person = JsonProvider<""" { "name":"Jiraiya", "age":54 } """> let person = Person.Parse(""" { "name":"Naruto", "age":16 } """) person.Name // わーおw(゚o゚)wインテリセンスが効くし型も付いている person.Age // わーおw(゚o゚)wインテリセンスが効くし型も付いている
型プロバイダーが型として提供できないようなメタデータが型プロバイダーに与えられた場合、コンパイルエラーとなる(そのように実装している場合に限る)。型プロバイダーの主目的はコンパイル時プログラミングではないものの、型のないものを扱う際に生じやすいSHOUMONAIバグを未然に防ぐことができるソリューションと言うこともできる。型のないものを安全に扱える世界があなたの手中に的な。
型プロバイダーさん「ALL YOUR TYPES ARE BELONG TO US」 カッコイイ…! #fsugjp
— 黒曜 (@kokuyouwind) 2014, 8月 3
型プロバイダーさんステキ!抱いて!
この世のあらゆるものに型を付けた男、型王タイプロジャー。彼の死に際に放った一言は人々を型へと駆り立てた。「型が欲しい? 欲しけりゃくれてやる。作れ! この世の全ての型はここに集まる!」男達は型プロバイダーを作り夢を追い続ける。世はまさにインフォメーションリッチプログラミング時代!
— ぜくる (@zecl) 2014, 8月 13
型プロバイダーの作成って難しそう(実際難しい)
一応それなりに F# を追っかけているマンなので、某サンプルの「Hello World TypeProvider」くらいはチョロっとかじりました。
でも、特に作りたいオリジナルのネタもなくって(あるいは既に先駆者がいたりで)、なかなか触れる機会に恵まれまれずにコンニチに至ります(言い訳)。そういう人多そう。実装したいネタがどうこうというより、そもそも難しかったり取っつきにくかったりで手が出しずらいという説もある。もし詳細を知りたいなら FSharp.Data等のライブラリのソース嫁がデフォというなかなかに漢らしい感じだし。何か作りながら覚えようにも、予期せぬエラーとそのメッセージに悩まされることも多いし、デバッグ実行で地道に追っても原因がよくわからず途方に暮れるなんてこともあり...結構ハードルは高い。実際上級者向けではある(個人の感想)。
「型プロバイダーってアレでしょ?作るもんじゃなくて、使うもんでしょ?」
難しいことはよくわからないけど、F# のすごい人たちが「"型のないもの"に"型を付けてくれる"」とっても便利でクールなライブラリを作ってくれていて、「オレのような一般 F# ユーザーは利用者としてその恩恵を受けることができればいいよね。」くらいに割り切って押さえておくだけでもよいという代物かもしれない。
TypeProviderを作る場面にぶち当たらない…というか作ってまで幸せになる場面にぶち当たらない(´・ω・`)
— omanuke (@omanuke) 2014, 8月 14
ごもっともすぎるご意見。汎用的で有用な型プロバイダーを自分で実装するような機会は、あまりないような気がする(便利そうなやつはもう既に誰かが作ってくれていることが多いし)。概要だけ把握しておいて、もし実装する機会があったらそのときじっくり調べながら頑張ればいいんじゃないだろうか。必要に応じて。
F# 上級者です!(ドヤァ #型プロバイダーわかりません
— いげ太 (@igeta) 2013, 11月 29
【朗報】型プロバイダーは華麗にスルーしても上級者になれる(!)
逆に言うと、型プロバイダーがわかったからって上級者にはなれません。
型プロバイダーの作成って面白そう
2014年8月3日に F# Meetup in TokyoおよびそのPart1という素晴らしいイベントがあり、fsugjp がやまだかつてない程の盛り上がりがあったようです。そのイベントで@kos59125さんによるTypeProviderに関する発表があり、更に後日@bleisさんによる、TypeProviderについて、勝手に補足がありました。素晴らしい。私は参加できませんでしたが、F# Meetup in Tokyo #fsugjp - Togetterまとめで雰囲気だけ味わいました。
触発されて何かしら型プロバイダーを作りたくなった。軽い気持ちで...、とりあえず役に立たない系型プロバイダーを作ってみた。
プロジェクトコンテンツから読み込めるようにしておきますね https://t.co/iefUg5eDDw @zecl ちょっと草植えときますね型言語Grass型プロバイダーhttps://t.co/JyneEYfunf … 書いてみた。Grassを安全に...
— Tomoaki Masuda (@moonmile) 2014, 8月 6
@moonmileさんにフィードバックを頂きました。どうもありがとうございます。
TypeProviderはProvidedType.fs(か、StartarPack)を使えばいいということだけ覚えておけばあとはなんとか。 #暴言
— yukitos (@yukitos) 2014, 8月 13
ゼロから自分で実装することも不可能ではありませんが...基本的にはこの方法しかないといっても過言ではないので、なにかしらのProvidedType.fs(の類)を使いましょう。
役に立つ立たないは置いておいて勉強したい場合はとりあえずなんか作ってみる。そうじゃやない場合は概要だけ抑えて華麗にスルーする。でいいと思います。