yamicha.com's Blog - Presented by yamicha.com
Blog yamicha.com's Blog - 2017/11 の記事
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30]

yamicha.com's Blog
 諸事情により、現在更新休止中。ご了承ください。もし今後ブログを再開することがあるとすれば、その際にはこのブログスクリプトではなく、新しく開発したものによるかもしれません。
 当ブログ管理者についてはこちらをご参照。
開発魔法(737)
社会問題(733)
お知らせ(11)
質問・バトン回答(15)
ゲスト出演(8)
経済・知的財産(150)
ゲーム開発(182)
[Ada] 勝手に補足
- Note
- 金配りの次の一手


- Endless Ultimate Diary
- 銃世界

漢字バトン
- うるる雑記帳
- 漢字接力棒

ツキアイゲノムバトン
- ブログ@うにうに画像倉庫
- あぶ内閣

縺イ縺セ縺、縺カ縺励ヰ繝医Φ
- 月夜のボヤキ
- 騎士サーラバトン
パスワードを使う
名無し (2012/02/27)


開発者解放裁判
yamicha.com (2010/03/14)
Winnyに関しては、私も「純白」とまでは考えておりませんし、使用し..

開発者解放裁判
通りすがり (2010/03/08)
winnyに関しては「ダウンロードソフト板」なんてところを拠点に開発..

新型インフルエンザの恐怖
いげ太 (2009/11/03)
> C#などの「int Some(int , int)」は、F#では「(int * int) ->..

時効に関する思考
yamicha.com (2009/08/31)
>いげ太さんコメントありがとうございます。手元にドキュメントが少..
Homepage
Blog Top
Normal View
List View
Search
Calendar
Comment List
Trackback List
Blog RSS
Send Trackback
Phone Mode
Administrator
yamicha.com
Blog
るううるる。
Source
法令データ提供システム
FindLaw
Development
Java2 Platform SE 6
Java EE 6 API
MySQL Developer Zone
PHP Reference
MSDN Library
Ada Reference Manual
Objective Caml
Python Documentation
Erlang
Prolog Documents
時効に関する思考
2009/07/18(Sat)23:00:22
 7月17日、法務省の勉強会が殺人の公訴時効を撤廃する案を示しました。殺人など重大犯罪に対する時効の撤廃に関しては、以前から賛同する意見も少なからず見受けられ、科学捜査の進展もそれを後押ししているようです。また、海外には殺人の時効を定めない国も存在しており、例えば「疑惑の銃弾」逮捕問題で騒がれたロサンゼルスでは、殺人には時効がありません。かねてから時効撤廃の動きは存在していましたが、より強まりつつある印象です。
 一方、民主党は時効撤廃に慎重な構えを見せており、政権が交代した場合に時効撤廃がなされる可能性は、自民党政権が続く場合より低いともみられます。ただし、自民党が今後も政権を握るにしても、麻生氏が総裁のポストに就いていられる期間は短いはずですから、後任者が導入に積極的であれば導入は早まりますし、否定的なら導入は見送られるなど、なお流動的な側面は多く持ち合わせています。
 時効撤廃に関する私の意見は以前の記事にも書いていますが、基本的に私は安易な時効の撤廃には賛成しません。理由のほとんどは以前の記事に書いてしまっていますが、その後に足利事件の犯人とされた人が冤罪と判明し、一方で時効撤廃の動きはより進みつつあるなど、多少は状況の変化が生じており、また時効撤廃問題は大変に重要なものですので、多くは繰り返しとなりますが、今回再び言及しておきます。
 時効撤廃の最大の欠点は、冤罪を生じる可能性です。他にも複数の理由が明示されていますが、中には疑問があるようなものも存在し、そのうちの一部は撤廃賛成派の自説の増強のために使用される有様です。「長らく逃亡生活を余儀なくされる苦痛により、罪が償われたと考える」なる説は、時効まで逃げ延びた犯人と同等の苦痛を味わった末、時効寸前に逮捕されたとしても罪が軽減されないため、疑問があります。「被害者の感情が薄れる」なる理由は必ずしも事実ではありませんし、これを否定する被害者側のコメントを使い、逆に時効撤廃論を主張する糸口に利用した新聞のコラムまであるほどです。
 捜査につぎ込めるリソースは有限ですが、時効撤廃によってリソースが分散し、最近発生した解決可能性の高い事件の捜査に影響しかねないというのは、現実的な問題点です。ただ、捜査を続ける期間の目安をあらかじめ定めておき、期間経過後は新情報をつかんだ時のみ動いたり、あるいは別件で犯人が見つかったような場合に逮捕できるようにすることを目的とするなど、一応の妥協は不可能ではありませんし、現実にはそのように運用されるでしょう。
 しかしながら、冤罪の問題は容易には解決できません。時効で犯人が逃げ延びてしまう憤りは良く分かりますが、冤罪となれば無辜の人間の人生がぶち壊しにされ、その上に犯人は逃げ延びてしまうのです。時には後から犯人が見つかる場合や、犯人の発見によって冤罪被害者が解放される例もありますが、冤罪認定されつつも犯人は見つからない例も多くあります。現在の殺人の時効は25年ですが、25年も経てば証拠の多くは散逸し、冤罪の回避はより難しくなります。いくら25年経過したからと、犯人を無罪放免にするのは大変腹立たしい話ではありますが、無理に逮捕して冤罪が生じ、真犯人を無罪放免にした上に無関係の人の人生をぶち壊しにするよりマシです。
 DNA鑑定など様々な科学捜査の技術が進展し、その精度も大幅に上昇している昨今では、これを理由として冤罪がなくなると主張する人も見受けられます。最近話題の「ジョン・ドゥ起訴」は、犯人のDNAが分かっている場合に犯人不明のまま起訴を行うものですから、言うなれば犯人のDNAが判明している場合に時効を止めてしまう方法です。こちらはDNAという「冤罪を起こしえない動かぬ証拠」を求めていますので、時効撤廃の欠点をある程度解消しているともいえます。
 しかしながら、科学によって冤罪をなくすためには、おそらくタイムマシンの完成を待たなければなりません。DNA鑑定などの科学捜査は万能ではなく、これを盲信して失敗した例が足利事件です。DNAが有罪の証拠となったはずが、後から無罪の証拠になってしまうという、実に皮肉な冤罪事件でした。現在ではDNA鑑定の精度が大幅に上がっており、今後とも上昇を続けていくはずですので、精度面での冤罪は少なくなるものと予想されますが、それでも科学捜査盲信の教訓として本事件は重要でしょう。
 本来、科学捜査による証拠は客観的に被告人の有罪・無罪を示すためのものであるはずですが、検察と弁護側で同じものを鑑定したところ、なぜか別々の鑑定結果が出るようなケースもあります。また、鑑定物品の状況や位置づけによっては、被告人が犯人である可能性こそ示すものの、確実に犯人であるとまでは示さない場合もあります。科学の専門家ではない裁判官は、このような鑑定を基に有罪か無罪かを決定しなくてはなりません。
 さらに私が不安視しているのは、検察側が証拠を捏造したり、恣意的な方法を用いる可能性です。「荒唐無稽」「うがちすぎ」との意見が飛んできそうですが、その思い込みこそが怖いのです。事実、数十年前までの事件には証拠の捏造を強く疑わせる事例が存在しますし、現代の事件についても数十年後にそうした疑いが出てくるかもしれません。あるいは、人間ですからミスもあるでしょう。科学捜査が正確であればあるほど、ミスや捏造の影響は大きくなります。
 例えば、現場から何らかの遺留物が発見されたとしましょう。後はDNA鑑定をするだけですが、それが犯人のものであると誰に分かるのでしょうか。最近の科学捜査ではごく微量の試料からでも鑑定が可能ですが、それは逆に犯人と無関係のものを証拠としたり、無関係のものが混入してしまうリスクを負っています。最悪の場合、遺留物が捏造されている可能性すらあるのです。これを追試したとしても、出てくるのは検察の鑑定を裏付けるデータだけです。
 検察が鑑定の際、試料の少なさを理由として、試料をすべて使って鑑定してしまうような状況も考えられます。そうなると追試ができませんので、検察の鑑定結果がすべてとなります。また、試料は十分であったにもかかわらず、残りは廃棄された可能性も考えられます。追試や検証ができないものは、科学においてはまず相手にされませんが、裁判では十分な説得力を持ってしまうでしょう。
 疑いだせばきりがありませんが、これらは現実に発生する恐れがあります。無論、ほとんどの事例では捏造やミスなどないはずですし、あっては困りますが、ゼロとは言い切れません。そうなると、科学捜査の高い証明力が逆に作用します。
 どれほど技術が進んでも、精度の問題や捏造・ミス、または「犯人である可能性は示すが、犯人であると確定はしない科学捜査による証拠」はおそらく出続けるでしょう。「犯人であると確定はしない証拠」の一例としては、真偽はここでは論じませんが、和歌山カレー事件の弁護士が証拠の砒素についてそのように主張しています。弁護側は鑑定の信頼性自体をも疑っているようですが、仮に混入された砒素が被告人のものと同一であると確認できたとしても、それは同時に作られた砒素によるものかもしれないというのです。私にはこれが事実かどうかは分かりませんが、ともかく「犯人の可能性がある証拠」と「犯人である証拠」は別物です。
 何にせよ、科学捜査は絶対ではありません。被告人のアリバイや言動、周囲の証言、動機、その他の科学捜査によらない証拠も重要になります。仮に科学捜査の結果がクロであったとしても、アリバイを第三者含む複数人が証言し、動機も特に見当たらず、他に不審な人間がいたり、動機があったりする人間がいるなどの環境がそろえば、さすがの科学捜査も相当に重さが下がるでしょう。要は「科学捜査による証拠も証拠のうちの1つである」という実に当たり前の話です。
 ところが、時間が経つと証拠は散逸します。事件から何十年も経過すればなおさらです。そこで科学捜査による証拠を出されると、その他の証拠は極めて集めにくく、容疑を否定するのはほぼ不可能でしょう。科学捜査による冤罪の減少は大いに期待できるところで、これを理由とした時効撤廃論も分からないわけではありませんが、場合によっては逆にさえ作用してしまう可能性が否定できないのです。
 無論、現行の死刑相当の罪の時効25年であっても、十分に証拠は散逸しますので、似たような現象は発生しかねません。しかし、現実には抑止効果や法への信頼効果、冤罪の危険などを判断した上で、落としどころを見つけなくてはなりません。現状ではそれが25年となっています。さらに、死刑相当事件の時効を15年から25年にする改正が施行されたのが2005年の1月1日ですから、この25年という数字自体、適切なのかが未だに一切実証されていません。25年でも冤罪の危険があるのなら、期間無限ならなおさらでしょう。
 また、時効を過ぎてから犯人が名乗り出てくるケースもあります。それでも民事訴訟では遺族たる原告が勝訴したケースがあり、村八分にもなってしまうため、そうそう簡単に名乗り出られるものではないようですが、無実の人が冤罪で収監されている場合に真犯人が名乗り出れば、犯人とされた人は解放され、すでに刑期を終えている場合であっても、名誉回復としかるべき補償の要求ができます
 これらの欠点は、制度の設計次第である程度は回避できるかもしれません。もし欠点を十分に解消しつつ時効を撤廃できるのであれば、私は自分が賛成に回ることを否定しません。しかしながら、ただ単に時効をなくして終わり、というのでは賛成しかねます。
 余談ながら、現実的な問題として疑問なのですが、他の罪の時効との兼ね合いはどうするのでしょうか。時効が無期限となると、相当期間が経過した後に犯人が見つかる場合もあるわけです。しかしながら、実は傷害致死など他の罪状とすべき犯罪であったとすれば、そちらの罪が時効であれば罪には問えません。現状でも殺人は25年、傷害致死は10年が時効であり、この問題が発生する可能性はありますし、実際に発生した事例も実在しますが、殺人の時効が無期限となればなおさらです。さらには散逸した証拠を基に殺意の有無まで争うことになるのでしょうか。

 OOP以外の面では基本的にOCamlの二番煎じであり、しかもOOP周りなどの違いのせいでOCamlとはまた異なる知識が要求される、何とも立場に困る言語たるF#。しかしながら、裏を返せばF#には.NETのライブラリが使用できる利点があるのですから、やってみない手はありません。
 マニュアルを見る限り、OCamlにはデータベースにアクセスする標準の方法というものはないようです(Cライブラリを呼んだり、非公式に作られたOCaml用ドライバを使用したりすれば、データベースの使用自体は不可能ではありません)。一方、.NETにはADO.NETなるものが存在しており、しかも多くのベンダーはADO.NET用のドライバを提供しています。当然ながら、おそらくF#でも使用できるのでしょう。データベースにはいつもながらMySQLを使用します。ADO.NETはとにかく抽象化が薄いので、修正箇所は少々多くなりそうですが、おそらく他のデータベースでも使用できます。
 まずは単なる接続と切断より。
#indent "off"

open System;
open System.Data;
open MySql.Data;
open MySql.Data.MySqlClient;

let connect : MySqlConnection = new MySqlConnection
	(@"Database=yamicha;
	Data Source=localhost;
	User Id=yamicha;
	Password=password;
	CharSet=utf8");;
connect.Close ();;
 これを適当なファイルに記述して保存し、fsi中で
#load "filename";;
 と打って読み込むなり、fsi.exeの引数にファイル名を指定するなり、fsc.exeでコンパイルして実行するなりすれば、ひとまずデータベースには接続できるようです。その際には-r引数でMySQLのドライバを指定しなければならない場合があります。
 これで接続ができるようになりましたので、次は作成や更新など結果を返さないクエリを発行してみます。ただ、単に接続して切断するだけならまだしも、実際に何らかのクエリを実行するとなると、言うまでもなく例外処理が問題になってきます。catchが厳しく義務付けられているJavaと違い、C#やF#では例外処理を書かなくても動きはしますが、これはよろしくないコーディングですので、まずは例外を取り扱ってみましょう。
 F#における例外構文はOCamlに似ていますが、.NETの機能をも取り入れているため、例によって何ともややこしい状況になっています。
#indent "off"

open System

(* 引数に true を渡した場合に NullReferenceException を投げる関数 *)
let raise_func (r : bool) : unit = match r with
	| true -> raise (NullReferenceException "Test Exception")
	| false -> Console.WriteLine "Normal Exit";;

try
	raise_func false;	(* 例外は投げられない *)
	raise_func true	(* ここで例外が投げられる *)
with
	| :? NullReferenceException as msg -> Console.WriteLine msg
 ちなみに、OCamlの場合はこうなります。
exception Test_Error of string;;

let raise_exception (r : bool) : unit =
	match r with
	| true -> raise (Test_Error "Test")
	| false -> print_string "Normal Exit";;

try
	raise_exception true
with
	| Test_Error msg -> print_string msg;;
 ここで疑問となるのが、F#にのみ存在する「:?」と「as」です。F#のマニュアルの記述例を参考にして書いてみたものの、何の意味があるのかはよく分かりません。しかしながら、下手に除去すると動作しなくなったり、警告が発生してしまいます。これらは一体何の意味を持っているでしょうか。
 F#は.NET上の言語ですから、Exceptionなどの例外用クラスを継承したクラスが例外として扱われます。先ほど使用したNullReferenceExceptionにしてもそうですし、配列やSQLなどの例外も同様です。
 一方、OCamlは「exception ExceptionName of ...」の構文で例外を作成します。こうして作成した例外は、raiseで投げたりtry-withで受け取ったりできるようになります。上記のコードであれば、Test_Errorなる名前の例外を作成しています。
 ところが、実際にはF#でもこの方法による例外の作成ができてしまうのです。おそらく互換性を重視した結果なのでしょう。したがって、F#では以下のようなコードも動作してしまいます。
#indent "off"

open System

exception Test_Error of string;;

let raise_exception (r : bool) : unit =
	match r with
	| true -> raise (Test_Error "Test")
	| false -> Console.WriteLine "Normal Exit";;

try
	raise_exception true
with
	| Test_Error msg -> Console.WriteLine msg;;
 この場合はOCamlと同じ構文で例外をキャッチしています。なお、基底クラスについて調べてみたところ、Test_ErrorはExceptionを継承していましたので、どうやらOCaml風にexception宣言した場合であっても、Exceptionの派生型として処理されているようです。
 ところが、このように書くと動かなくなります。
try
	raise_exception true
with
	| :? Test_Error as msg -> Console.WriteLine msg;;
 OCamlスタイルで書いた場合にはOCamlと同様に処理し、Exceptionを継承したクラスとして例外を書いた場合には:?などの記述が必要となるのでしょうか。
 確認として、以下のようなものを書いてみました。
#indent "off"

open System

type Test_Error = class
	inherit Exception
	new (d : string) = {inherit Exception (d)}
end;;

let raise_exception (r : bool) : unit = match r with
	| true -> raise (Test_Error "Test")
	| false -> Console.WriteLine "Normal Exit";;

try
	raise_exception true
with
	| :? Test_Error as msg -> Console.WriteLine msg;;
 結果、正しく動作しました。この場合は.NET標準のExceptionを継承するスタイルで例外を書いていますので、:?を使うものとみられます。
 話が例外処理に脱線してしまいましたので、この辺りでデータベースへのクエリ発行に戻ります。ただ、その前にもう1つ例外について述べておくなら、例外処理の記法にはtry-withの他にtry-finallyも用意されており、データベース処理では割と有用です。
try
	raise (System.NullReferenceException ())
finally
	Console.WriteLine "Finally"
 例外が発生していても、発生していなくても、finallyは実行されます。例外が発生していた場合には、finally実行後に例外が上へと伝えられます。
 それでは、CREATE文で適当なテーブルを作り、適当なデータをINSERTするプログラムを書いてみるとしましょう。
#indent "off"

open System
open System.Data
open MySql.Data
open MySql.Data.MySqlClient

let CreateTable : unit =
	let connect : MySqlConnection = new MySqlConnection
		(@"Database=yamicha;
		Data Source=localhost;
		User Id=yamicha;
		Password=password;
		CharSet=utf8") in
	connect.Open ();

	let post_query =
		let cmd : MySqlCommand = connect.CreateCommand () in

		let commands : string list =
		[@"CREATE TABLE fs_lang_genre(id INT ,
			name VARCHAR(32) , PRIMARY KEY(id))";
		@"CREATE TABLE fs_lang_cont(id INT ,
			genre INT , name VARCHAR(32) ,
			PRIMARY KEY(id) , FOREIGN KEY(genre) 
			REFERENCES fs_lang_genre(id) ON DELETE CASCADE)";
		@"INSERT INTO fs_lang_genre 
		VALUES(1 , 'Procedural') , (2 , 'Functional')";
		@"INSERT INTO fs_lang_cont VALUES(1 , 1 , 'C#') ,
			(2 , 1 , 'Ada') , (3 , 1 , 'COBOL') ,
			(4 , 2 , 'OCaml') , (5 , 2 , 'Scheme') ,
			(6 , 2 , 'F#')"
		] in

		List.iter (fun x -> cmd.CommandText <- x;
			ignore (cmd.ExecuteNonQuery ())) commands
	in try
		post_query
	finally
		connect.Close ();;

CreateTable
 F#の機能であるiterを使用するなど、C#などとは多少違う趣にはなっていますが、C#でADO.NETさえ扱ったことがあれば、ほぼ見ての通りのコードでしょう。cmdはオブジェクトですので、プロパティへの代入には<-を用いています。
 なお、ignoreは「'a -> unit」で、返り値を捨ててunitを返す関数です。F#で返り値が不要の場合は、これを使って返り値をunitにする必要があります。以前、開発のTipsとして「voidを返すような関数では、voidではなく自分自身(C++などでは自分自身へのポインタ)を返すべし。そうすればチェーン状につなげやすくなる」なるものを見たことがありますが、このようなスタイルで作られたライブラリをF#で使用すると、少しばかり迷惑な状況になりそうです。
 無駄話はともかく、これでデータベースにデータを登録できます。
SELECT genre.name AS 'genre' , cont.name AS 'lang' FROM fs_lang_genre genre
INNER JOIN fs_lang_cont cont ON genre.id = cont.genre;

genre	lang
Procedural	C#
Procedural	Ada
Procedural	COBOL
Functional	OCaml
Functional	Scheme
Functional	F#
 後は読み込みですが、データを取り出す際にはいくつかの操作が必要になりますので、構造はもう少し難解になります。ただ、基本的にはC#などの場合と変わりませんので、F#の文法以外の点ではこれといった問題はないでしょう。SQLのデータを読み込む際には、大抵の場合にループ処理を使用するものですが、別にwhileを使用した手続き型スタイルで書いても構わないものの、せっかくF#を使うのなら再帰を使った方が面白いでしょう。
 そのまま読み出すだけでは芸がありませんので、プリペアドステートメントも使用してみました。
#indent "off"

open System
open System.Data
open MySql.Data
open MySql.Data.MySqlClient

let ShowDatabase (genre_id : int) : unit =
	let connect : MySqlConnection = new MySqlConnection
		(@"Database=yamicha;
		Data Source=localhost;
		User Id=yamicha;
		Password=password;
		CharSet=utf8") in
	connect.Open ();

	let read_sql =
		let cmd : MySqlCommand = connect.CreateCommand () in
		cmd.CommandText <- @"SELECT cont.name AS 'lang'
		FROM fs_lang_genre genre INNER JOIN fs_lang_cont cont ON
		genre.id = cont.genre WHERE genre.id = ?genre_id";
		let param : MySqlParameter = cmd.Parameters.Add
			("?genre_id" , MySqlDbType.Int32) in
		cmd.Prepare ();
		param.Value <- genre_id;
		let reader : MySqlDataReader = cmd.ExecuteReader () in
		let rec show_all (r : MySqlDataReader) : unit =
			match reader.Read () with
			| true -> Console.WriteLine (r.GetString "lang");
				show_all r
			| false -> reader.Dispose ()
		in show_all reader
	in try
		read_sql
	finally
		connect.Close ();;

Console.WriteLine "Procedural:";;
ShowDatabase 1;;
Console.WriteLine "Functional:";;
ShowDatabase 2;;
 参照透過どころか大混濁なコードですが、ひとまず動作するようです。
カテゴリ [開発魔法][社会問題] [トラックバック 0][コメント 2]
<- 前の記事を参照 次の記事を参照 ->

Comments(2)
yamicha.com - 2009/08/31(Mon)00:20:56
>いげ太さん
コメントありがとうございます。
手元にドキュメントが少なく、読み取る言語能力もなく、さらにこのPCでは.NET Frameworkの新しい版が動作しないためにMonoを使わなくてはならず、結果としてF#も型落ち傾向、という状況だけに、かなり稚拙なことも書いているであろうことは自覚していましたが、早速ご教授をいただけるとは、ありがたい限りです。
なるほど、そのような事情があったのですか。個人的には関数型言語は(下手の横好きながらも)割と好きですので、F#の登場には少しばかり期待していたのですが、やはり.NETの仕様にねじ込むのはカルチャーショックが少なくないようで。
とりあえず、早くガイドラインを出して欲しいです。「日本語で」。>Microsoft

>#indent "off"
ドラフト仕様のページで用いられていた書き方ですが、情報が古いのかもしれません。ただ、このブログでF#を扱う直前には一応「Monoで動く最新版」を入れたはずで、この仕様ページは実際にMonoで使用しているF#のバージョンのものですから、それに従っておくのが最も安全ではないかと判断した次第です。

それにしても、F#使いの方などそうそういるものではないと考えていましたが、まさかこのような取るに足らないブログに対し、コメントまでいただけましょうとは。
大変分かりやすいご教授、厚くお礼申し上げます。

いげ太 - 2009/08/29(Sat)17:13:08
> F#にのみ存在する「:?」と「as」です。
> (中略)
> これらは一体何の意味を持っているでしょうか。

as パターンは、OCaml に存在するそれと同じです。[パターン] as [変数] の形で使用し、[パターン] にマッチした値そのものを [変数] に束縛します。:? は、Type test pattern と呼ばれるもので、型によってマッチを行うためのパターンです。こちらは F# の独自機能です。

http://msdn.microsoft.com/en-us/library/dd547125%28VS.100%29.aspx

OCaml における例外は、実質的にヴァリアントのコンストラクタと同じものである、例外コンストラクタを定義して行います。例外(例外コンストラクタ値)は、ヴァリアント値のパターン マッチと同じようにして、try 式で捕まえることができます。

しかし、F# は .NET の言語です。.NET の例外は、クラスの階層構造(継承)によって種類分けされて、すでに Framework 上に定義されています。そのため、型によるマッチを行う必要があり、つまり :?(Type test pattern)によって例外のキャッチを行うのです。

F# の例外には .NET 方式と OCaml 方式の両方が存在します。ただし、F# を使用するに当たって、既存の .NET クラス ライブラリを使用しないということはまずあり得ませんから、統一性を持たせるためには .NET 方式で行うのがよいのだろうと思います。

# ソースを失念したのですが、F# 開発チームの誰かも、どっかで「基本的に、例外は .NET 方式でやってね」と言っていたような気がします。

# というか、公式なデザイン ガイドラインが出てくれば一発解決なんですけどね。正式リリース前に無茶な要望ではあるのですが、早く欲しいとこですねー。

ところで「#indent "off"」とはめずらしい書き方ですね。#light "off" と同等のディレクティブでしょうか?

- Blog by yamicha.com -