ようこそ。睡眠不足なプログラマのチラ裏です。

型プロバイダー(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バグを未然に防ぐことができるソリューションと言うこともできる。型のないものを安全に扱える世界があなたの手中に的な。

     
型プロバイダーさんステキ!抱いて! 

 

   

型プロバイダーの作成って難しそう(実際難しい)

一応それなりに F# を追っかけているマンなので、某サンプルの「Hello World TypeProvider」くらいはチョロっとかじりました。

  チュートリアル : 型プロバイダーの作成 (F#) 
 

でも、特に作りたいオリジナルのネタもなくって(あるいは既に先駆者がいたりで)、なかなか触れる機会に恵まれまれずにコンニチに至ります(言い訳)。そういう人多そう。実装したいネタがどうこうというより、そもそも難しかったり取っつきにくかったりで手が出しずらいという説もある。もし詳細を知りたいなら FSharp.Data等のライブラリのソース嫁がデフォというなかなかに漢らしい感じだし。何か作りながら覚えようにも、予期せぬエラーとそのメッセージに悩まされることも多いし、デバッグ実行で地道に追っても原因がよくわからず途方に暮れるなんてこともあり...結構ハードルは高い。実際上級者向けではある(個人の感想)。 

 

「型プロバイダーってアレでしょ?作るもんじゃなくて、使うもんでしょ?」 

 

難しいことはよくわからないけど、F# のすごい人たちが「"型のないもの"に"型を付けてくれる"」とっても便利でクールなライブラリを作ってくれていて、「オレのような一般 F# ユーザーは利用者としてその恩恵を受けることができればいいよね。」くらいに割り切って押さえておくだけでもよいという代物かもしれない。

 

   

ごもっともすぎるご意見。汎用的で有用な型プロバイダーを自分で実装するような機会は、あまりないような気がする(便利そうなやつはもう既に誰かが作ってくれていることが多いし)。概要だけ把握しておいて、もし実装する機会があったらそのときじっくり調べながら頑張ればいいんじゃないだろうか。必要に応じて。 

 

    
   【朗報】型プロバイダーは華麗にスルーしても上級者になれる(!) 逆に言うと、型プロバイダーがわかったからって上級者にはなれません。


型プロバイダーの作成って面白そう

2014年8月3日に F# Meetup in TokyoおよびそのPart1という素晴らしいイベントがあり、fsugjp がやまだかつてない程の盛り上がりがあったようです。そのイベントで@kos59125さんによるTypeProviderに関する発表があり、更に後日@bleisさんによる、TypeProviderについて、勝手に補足がありました。素晴らしい。私は参加できませんでしたが、F# Meetup in Tokyo #fsugjp - Togetterまとめで雰囲気だけ味わいました。 触発されて何かしら型プロバイダーを作りたくなった。軽い気持ちで...、とりあえず役に立たない系型プロバイダーを作ってみた。  

    @moonmileさんにフィードバックを頂きました。どうもありがとうございます。 

 

 
ゼロから自分で実装することも不可能ではありませんが...基本的にはこの方法しかないといっても過言ではないので、なにかしらのProvidedType.fs(の類)を使いましょう。 役に立つ立たないは置いておいて勉強したい場合はとりあえずなんか作ってみる。そうじゃやない場合は概要だけ抑えて華麗にスルーする。でいいと思います。 



f:id:zecl:20140825173101p:plain