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/03/05(Thu)20:30:05
 ついに金配りが再可決されてしまいました。以前から成立の可能性は濃厚になっていたとはいえ、このようなあまりにもふざけた策を本気で再可決・成立させてしまうなど、もはや頭がどうかしているとしか考えられません。この戦後最大の愚策は、戦後最悪の首相・麻生氏の名とともに、当面は人々の記憶に残ることでしょう。
 なお、当ブログの内容を理解できるだけの頭脳をお持ちの方に対して、この程度のことを説くのは釈迦に説法かもしれませんが、配られる金を安易に使用しては絶対にいけません。私はただ「節約です」を唱えるだけの、テープレコーダー同然の経済評論家とは違いますが、こればかりは確実に言えます。金配りは国民の金を選挙対策に使用する犯罪まがいのバラマキであって、「金のなる木」を原資にしたわけではありません。2兆円を配るとなると、当然ながら2兆円の支出が生じますし、付随費用を考えるとそれ以上です。
 したがって、どこかでこの2兆円の埋め合わせをしなければなりません。そのためには、入り口を増やすか、出口を減らすしかありません。つまり、この2兆円は税として取り立てるか、さもなくば福祉などを切り捨てて埋め合わせをする必要があります。それが増税にせよ福祉切り捨てにせよ、国民が2兆円分の埋め合わせを求められるのは変わりません。確実に代償を払わされる以上、安易に配られた金を使用しては絶対にいけません。言うなれば、これは借金と同じなのです。
 同様の理由により、麻生氏のような成金でもない限り、安易な辞退もおすすめできません。どうしようもない愚策に対するお怒りはごもっともですが、受け取る・受け取らざるにかかわらず、代償は必ず払わなければなりません。これを辞退するのは、金を借り入れて国に寄付するのと全く変わりません。
 あるインターネット上の調査では、なぜか金配りを「うれしい」とする人が過半数を超えていましたが、このような人は「朝三暮四」を知らないのでしょうか。一応付記しておきますと、それでも2兆円の適切な使い道としては圧倒的多数の人が景気対策や福祉を挙げており、金配りをすべきとした人は10%程度であったように記憶していますが、私は自信を持って「うれしくない」と言い切れます。必ず埋め合わせを求められ、確実に代償を払わなければならない金配り政策の、一体何がうれしいというのでしょうか。全く理解できません。
 世論調査でも過半数が金配りに反対していたとはいえ、一部には賛成する声も存在し、全く理解に苦しむばかりです。確かに、後で代償を求められたとしても、今すぐ現金を手に入れたい人もいるのかもしれませんし、そうした事情のある人を責めるわけにはいきません。しかし、全員に12000円を配るのではなく、そのような困窮した人に10万円、20万円分の支援を行うのが政治の責任ではないでしょうか。
 さらに言えば、金配りほど弱者のためにならない政策はありません。後で確実に代償を求められる以上、庶民は金を消費に回すどころではありませんが、多少の増税や福祉切り捨てでは困らない金持ちは遠慮なく消費に回せますので、金持ちにとってはうれしい策といえます。税は本来「富の再配分」のためにあり、弱者にこそ手厚く配分すべきなのですが、金配りは金持ちを含む全員に同額を配るという愚かすぎる案ですので、再配分効果も望めません。
 それでも、「庶民」はまだ恵まれているといえるかもしれません。「難民」や家庭内暴力被害者といった本当の弱者の方々の中には、金配りを受けられない人も少なからず出てくるでしょう。そうした人々は金を受け取れないばかりか、代償だけは払わなければなりません。いわば弱者に借金させて金を取り上げているようなものですが、暴力団がやっているならまだしも、これは国策なのです。
 そのような意味で、麻生氏が「弱者支援」から「消費拡大」に金配りの目的を変移させたのは、唯一の正解といえるでしょう。金配りは金持ちなら受け取って使用でき、庶民は受け取っても安易には使用できず、本当の弱者は受け取れない可能性すらあるものです。金配りは「弱者支援」としては落第ですが、目的が「消費拡大」であればむしろ金持ちを太らせた方が都合が良いわけですから、金持ちにも同額が配られる金配り政策を正当化するには、そちらの方が好都合なのです。無論、金持ちの絶対数や弱者支援・福祉充実の必要性から考えて、消費拡大効果もたかが知れており、しかも弱者支援・福祉の方が優先順位は非常に高いはずですので、金をドブに捨てていることには変わりありません
 不安なのはここからです。このブログの内容を解せるほどの人に言うべきことでないのは重々承知していますが、失礼を承知で書かせていただくなら、もともと麻生氏を支持している人ならまだしも、そうでない人は特に、金を受け取ったからといって、麻生氏の支持に回るようなことをしては絶対にいけません。万が一これで支持が盛り返すような事態になれば、最悪の場合「立場がまずくなったらバラマキ」が習慣化してしまいます。これは日本にとってあまりにも大きな損失ですので、絶対に認めてはなりません。
 自民党の劣化にも失望を禁じえません。最初から退席を明言しており、しかも引退を表明している小泉氏を除けば、金配りに対して退席したのは小野氏ただ1人、反対に至っては1人たりとも存在しない有様です。金配りが確実に国民のためにならない以上、国民のために首をかけてでも反対しようという志のある人がいてもおかしくはありませんが、実際には誰一人として存在しないのです。ある程度の造反の可能性が取りざたされていただけに、これには非常に強い失望を覚えざるを得ませんでした。この分では、自民党はもうおしまいでしょう。仮に選挙に勝てたとしても、劣化の状態は覆い隠しようもありません。
 しかも、麻生氏は金を配れば支持を得られると考えているのです。あまりにも国民の知性を愚弄しています。麻生氏が国民をなめきっていることは、以前の「脳内メーカー」や「アキバ総理」発言による浅はかな若者の切り崩し、さらにさかのぼれば「下々の皆さん」発言などにも現れていますが、金を配って支持をさせようなどとは、あまりにも度を越しています。それにしても、「金さえ配れば国民は自分を支持する」とは、何とさもしい考えなのでしょうか
 今後の監視も怠りなく行うべきです。おそらく金配りの効用は大したものにはならないと見られますが、「四捨五入」騒動などを見る限り、政府が金配りの効果を誇張してくる可能性は十分に考えられます。あるいは「受け取った人がこれだけいるのだから、金配りは多くの人に支持されていた」などと強弁するかもしれませんが、辞退とは借金をしてそれを国に寄付するようなものなのですから、受け取り人数と金配りへの支持は何の関係もありません。社会保障国民会議に見られるような、浅はかなトリックに引っかかってはいけません。
 それにしても、つくづく戦後最大の愚策が通ってしまったのは残念でなりません。これによって貴重な2兆円の財源をドブに捨ててしまったのですから、またしても日本が取れる手段は狭まり、景気建て直しへの道は遠のきました。麻生氏では絶対に無理ですので、次のリーダーがどの政党の誰であるにせよ、その人がやるよりありません。麻生氏に対しては、これ以上の身勝手な行動によって傷を広げてしまわないことだけを強く願います。

 金配りに反対するだけの志を持つ者すら存在しない自民党は、もはや完全に壊滅状態といえそうですが、対する民主党も民主党です。小沢氏の公設秘書が西松建設から違法な献金を受けて逮捕され、党内に動揺が走りました。今のところ小沢氏は潔白を主張していますので、現段階では確定的に小沢氏の罪を論じることはできませんが、政治不信を招きかねない問題といえるでしょう。
 あまりにもタイミングが良すぎるためか、民主党の内部からは「陰謀説」も出ているようです。麻生政権や自民党が国家権力を使って小沢氏の秘書を逮捕させ、民主党に大打撃を与えようとしたというわけです。確かに、これが麻生政権の差し金であるか否かにかかわらず、この時点での民主党の「敵失」は、自民党にとっては願ってもないものでしょう。解散の時期に影響を与えるとの憶測も出ているほどで、実際に自民党が大きく優位に傾けば、その勢いで解散を行う可能性は十分にあります。
 私は安易な陰謀説にくみする気はありませんが、確かにその可能性はゼロではないでしょう。以前の偽メール問題といい、自民党が窮地に陥った際には奇妙な事件が頻発します。その偽メールにしても、関係者とされた自民党議員の証拠調べはうやむやに終わり、一方で民主党はしばらくの間、なぜか自民党への追求をボイコットしてしまいました。その時の状況などを考えると、今回の件も話が上手すぎる気がしないでもありません。
 私は何も、これを陰謀であると言いたいのではありません。しかし、仮に政権が捜査権力を利用したとすれば問題ですので、あらゆる可能性を考えるのは当然です。もし与党がそのような権力と癒着しているのであれば、例えばライブドアの問題にしても、仮に堀江氏が「刺客」として当選していたら、問題がもみ消されていた可能性があるのです。これは非常に危険な事態ですから、疑いの目は持っておくべきです。
 ただし、本件が完全な捏造であるならともかく、もし秘書や小沢氏が本当に違法献金に関与していたのであれば、仮に逮捕が麻生政権や自民党の策略として行われたのであっても、その責任は追及されなければなりません。もし違法行為にかかわっていたのであれば、当然ながら代表辞任も視野に入ってくるでしょう。その場合、必死で代表の地位にしがみついたとしても、党のためにならないどころか、国民のためにもなりません。この大変な経済状況下で、麻生氏と小沢氏の泥仕合などを見せられては、国民としてはたまったものではありません。
 そもそも小沢氏は、本来なら大連立問題の時点で辞任させておくべき人間でした。麻生氏はあまりにも無能であるため、最近は小沢氏の方が「首相にふさわしい」とされる場合が多くなりましたが、それでも人気は芳しくありませんし、私は当初から「麻生氏にも小沢氏にも変革はできない」と主張してきました。壊し屋として人望はなく、政治家からも国民からもあまり信用を得ていません。民主党が大連立問題の際に氏を慰留したのは、小沢氏が旧自由党の面々を連れて自民党に行っては困るからという側面もあります。
 もし本件が冤罪でないとはっきりした場合には、小沢氏は即刻辞任を行うべきでしょう。また、後任には地味であっても優秀で実力のある若手を置くべきです。誰かに例えるなら、白川日銀総裁のようなタイプが良いでしょう。地味であれば人気取りは困難ですが、目立つばかりで何の実力も伴わず、日本の傷口を広げてばかりの麻生氏とは好対照となるでしょうし、何より今の日本にはそのような人が必要なのです。麻生氏や舛添氏といった目立つだけの面々では、絶対に変革は成し遂げられません。仮に今の自民党が麻生氏を廃したとしても、地味でも確かな実力のある人を後任に選ぶ可能性は高くなく、それよりも奇抜な人事で低IQ選挙に打って出てくる可能性の方が高いのです。そうなれば、実質的に日本を変革できるのは、民主党の新しいリーダーのみとなります。ここで民主党も人気取りに走り、麻生氏のような人間を立ててしまおうものなら、日本が経済を立て直す見込みはなくなります
 麻生氏は「とてつもない日本」のような本が好きなようですが、確かに日本には潜在能力があり、アイスランドと違って経済に実体もあり、派遣などの安易な規制緩和で足腰がやや弱っているとはいえ、経済危機をひっくり返すだけの力はあるはずです。しかし、それは麻生氏では確実に無理ですし、麻生氏よりマシとはいえ小沢氏にも成し遂げられません。無論、舛添氏のような人間でも間違いなく不可能です。くだらない低IQ人気取りを行わない、能力のある新しいリーダーのみが、それを成し遂げられます。
 これは自民党でも同じです。またしても首相の首をすげ替え、舛添氏のような人間を立てたとしても、それは間違いなく日本のためになりません。所詮は「小泉低IQ劇場」の末に後任は3人とも劇場運営に失敗し、しかも金配りに反対できる人間もいない政党なのですから、実力は二の次にして人気のみで次を選ぶ可能性が高いのですが、それでは日本を立て直すのは不可能です。

 Haskellは純粋な関数型言語です。したがって、何らかの関数呼び出しを複数並べる方法といったものすら存在せず、すべては渡した引数によって計算された返り値からなります。
 一方、OCamlは現実主義の言語です。これは、IOのような「状態」を持つ関数が自由に使用できる他、参照が使用できることを意味します。「状態」を強引にStateモナドといったものに織り込まなくても、変数を容易に変更したりできるのですから、このメリットは大きいです。ただ、関数型言語では参照型が必要になる場面自体がさほど多くないため、。
 参照型の変数を作成するには、参照とするものの前に「ref」と記述します。
(* 参照とするものの前に ref を記述 *)
ref 10;;

(* 関数 a の返り値である 100 が参照の値となる *)
let a = 100;;
ref a;;

(* あらゆるものが参照となる *)
ref ((+) 1);;
 int型のリストであれば、その型はint listとなりましたが、参照型ではlistの代わりにrefを使用し、int refなどとなります。
 デリファレンスには「!」を使用します。参照型の頭に「!」をつければ、参照の中身が元の型になって返ってきます。
!(ref 100);;

let r = ref 1000;;
!r;;
 参照型を使うからには、代入ができなくては意味がありません。OCamlでは「=」が関数の定義に割り当てられているため、代わりに「:=」を使用します。Adaの代入演算子と同一です。ちなみに、代入に「:=」を使うのであれば「<-」の方が適任のようにも感じますが、実はこれはこれでOOPの機能に使用されています。
 まずは単純に、手続き風に値を変異させる関数を作成してみましょう。ここでは、とある2つの2Dベクトルからその角度を求める関数を作成しました。
let theta ax ay bx by =
	let t = ref (ax *. bx +. ay *. by) in
	t := !t /. ((sqrt (ax *. ax +. ay *.ay)) *.
		(sqrt (bx *. bx +. by *. by)));
	t := acos !t;
	!t;;

(* 使用例 *)
Printf.printf "%f" (theta 1.0 1.0 0.0 1.0);;
(* 0.785398
この値を degrees 変換(180 を掛けて PI で割る)すると45度となる *)
 まず外積を求め、その結果を長さで割り、アークコサインで角度を求める、ごく単純な角度算出の実装です。まず「let t = ref ...」によって参照型を作成し、途中の計算結果を何回か代入し、その上で答えを求めて返しています。
 当然ではありますが、引数で結果を受けたりもできます。以下のプログラムはリストに計算を適用する関数の実装ですが、mapと違ってリストの中身を直接変更します。
let var_map (f : 'a -> 'a) (datas : 'a ref list) : unit =
	List.iter (fun x -> x := f !x) datas;;

(* 使用例 *)
let r = [ref 1; ref 2; ref 3; ref 4; ref 5] in
	var_map (( * ) 2) r;
	List.iter (fun x -> Printf.printf "%d " !x) r;;
(* 2 4 6 8 10 *)
 なお、unit型は前にも少々出てきましたが、返り値がないことを示す型といったところです。CやJavaのvoidに当たるものといえるでしょう。ただし、実際には「要素が0個のタプル」が返されています。タプルはPythonやHaskellにもある合成型ですが、これらの言語についてよく分からない方は、「メンバが一切ない構造体」とでも考えてください。
 ちなみに、参照型の変数代入演算子「:=」もunitを返します。代入は副作用のみを目的とするものであるため、意味のある返り値は存在しないのです。
 上記の例は少々込み入っていますので、もう少し簡単な例を。Cのstrcatもどきです。
let strcat (x : string ref) (y : string) : unit = x := !x ^ y;;

(* 使用例 *)
let str = ref "Eggs " in
	strcat str "Bacon ";
	strcat str "Spam!";
	Printf.printf "%s" !str;;
(* Eggs Bacon Spam! *)
 ここで登場した「^」演算子は、文字列を結合します。1つ目の引数で参照を受け取り、参照解除したものを2つ目の引数と結合し、それを再び1つ目の引数に代入しています。したがって、1つ目の引数とされた参照の内容が変更され、関数の外側にも影響を及ぼします。
 関数型言語においては、参照をあえて使用する場面はあまり多くありません。しかし、もし何らかの理由により、手続き型言語風に書く必要が生じた際には、参照がなくては話になりません。参照を使用できないのでは、ifで条件分岐したところで何の役にも立ちませんし、ループは永久に停止できません。手続き型言語スタイルと参照はセットと考えた方がよさそうです。
 OCamlはマルチパラダイムの言語ですので、whileやforなどいくつかのループ構文が用意されています。最も基本的なループであるwhileは次のように表記します。
while expr do
	codes...
done
 breakやcontinueは存在しないようです。また、ループ構文はunitを返します。
 他に必要なものといえば、条件分岐のif文でしょうか。ifは前回に取り扱いましたので、今さら特筆すべき点はないでしょう。ただし、OCamlのifはあくまで関数ですので、手続き型と同じように使えるとは限りません。
 まず、OCamlのifは返り値を持ちます。仮に以下のようなコードなら、
if true then 1 else 2;;
 これは「1」を返す式となります。また、ifは構文ではあるものの、関数でいうところの「bool -> 'a -> 'a -> 'a」ですので、thenとelseで型の違うものを返してはいけません。
(* エラー *)
if true then 1 else 'a';;
 通常の手続き型言語ではelseを省略できますが、OCamlでは上記のような関係上、then節がunitを返すのでない限り、elseを省略できません
(* エラー : int を返すものであるのに、else がない *)
if true then 1;;

(* OK : unit を返す場合は else を省略できる
なお、() は unit 値を表す表記である *)
if true then ();;

(* OK : Printf.printf は unit を返す関数であるため、else を省略できる *)
if true then Printf.printf "I'll return unit";;
 ifに関してもう1つ注意点を。手続き型のプログラミングを行う上では、thenやelseの内容が複数行に及ぶことは珍しくありません。仮にC++やJavaで
int x = 0;
int y = 0;

if(/* true or false */){
	x = 10;
	b = 20;
}
 このようなコードを書いたとして、OCamlでも同じものを書きたいとしましょう。それは次のようなコードでしょうか。
let if_sample =
	let x = ref 0 in
	let y = ref 0 in
	if true then
		x := 10;
		y := 20;
	Printf.printf "%d %d" !x !y;;

(* 10 20 *)
 得られた結果は正しいようですが、これは本当に正しいコードなのでしょうか。ここでコードの不自然さを見抜いた方は正解です。ifの条件をfalseにしてみると、
let if_sample =
	let x = ref 0 in
	let y = ref 0 in
	if false then
		x := 10;
		y := 20;
	Printf.printf "%d %d" !x !y;;

(* 0 20 *)
 trueの時のみxに10、yに20を代入させたいはずが、xは0でもyが20になってしまっています。これはつまり、上記のプログラムが次のように解釈されているためです。
if false then
	x := 10;	(* この式は if の対象 *)
y := 20;	(* これは if の外側 *)
 これを防ぐには、どこまでがifの中身かを示してやらなくてはなりません。カッコでくくるのが簡単でしょう。
let if_sample =
	let x = ref 0 in
	let y = ref 0 in
	if false then (x := 10; y := 20);
	Printf.printf "%d %d" !x !y;;

(* 0 0 *)
 あるいは、より手続き型風に書くために、糖衣構文としてbegin-endも用意されています。これはただの糖衣構文ですから、効果はカッコと全く同じです。
let if_sample =
	let x = ref 0 in
	let y = ref 0 in
	if true then begin
		x := 10;
		y := 20
	end;
	Printf.printf "%d %d" !x !y;;
 これはthen節だけでなく、else節にも当てはまります。すなわち、もしelse節が2つ以上の文から構成されるのであれば、then同様にカッコかbegin-endでくくらなくてはなりません。
let if_sample =
	let x = ref 0 in
	let y = ref 0 in
	if false then begin
		x := 10;
		y := 20
	end else begin
		x := 30;
		y := 40
	end;
	Printf.printf "%d %d" !x !y;;
 これらを踏まえて、手続き型のパラダイムで素数を求めるプログラムを作成しました。実装例を以下に示します。
let prime (x : int) : int list =
	let i = ref 3 in
	let result = ref [] in
	while !i <= x do
		let j = ref 0 in
		let prime = ref true in
		let r = ref !result in
		let max = (List.length !r) in
		while !prime && (!j < max) do
			if !i mod (List.hd !r) = 0 then
				prime := false;
			r := List.tl !r;
			j := !j + 1
		done;
		if !prime then result := !i :: !result;
		i := !i + 2
	done;
	1 :: 2 :: (List.rev !result);;

List.iter (Printf.printf "%d ") (prime 100);;

(* 1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 *)
 いくらか面倒な記述もありますが、ほとんど手続き型と似たり寄ったりでしょう。しつこいようですが、上記で頻出する「!」は否定ではなくデリファレンスです。
 それにしても、OCamlでの手続き型は少々面倒です。できることならもう書きたくありません。ちなみに、関数型で書くと以下のようになります。
let prime (p : int) : int list =
	let rec check d r = match d with
			| d when d > p -> 1 :: 2 :: (List.rev r)
			| _ -> check (d + 2)
				(if (List.exists (fun x -> d mod x = 0) r)
				then r else d :: r)
	in check 3 [];;

List.iter (Printf.printf "%d ") (prime 100);;
(* 1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 *)
 何とこれだけです。まさに関数型言語の本領発揮です。
 上記ではList.existsを使用しているため、手続き型スタイルの際にコードを冗長にしていた「既知の素数で割ってみる」動作を削減できているのですが、仮にこれを使わなかったとしても、
let prime (p : int) : int list =
	let rec check d r =
		let rec exists datas = match datas with
			| x :: xs when d mod x = 0 -> true
			| x :: xs -> exists xs
			| [] -> false
		in match d with
			| d when d > p -> 1 :: 2 :: (List.rev r)
			| _ -> check (d + 2) (if (exists r) then r else d :: r)
	in check 3 [];;
 せいぜいこの程度の長さになるだけです。そもそもList.existsも関数型言語の特徴たる高階関数ですし、関数型がいかに強力であるかが分かります。
 次に、先ほど出てきた「タプル」について。タプルは「組」などと呼ばれる場合もあり、いくつかの変数(OCamlで「変数」の言い方が適切かは不明ですが)を1まとめにするものです。
 タプルはリストと違い、値の数は変更できませんが、要素が同じ型である必要はありません。名前のない構造体のようなものと考えられます。
(* 整数2つのタプル *)
(1 , 2)

(* 整数と文字列のタプル *)
(1 , "one")

(* 要素が3つのタプル *)
(1 , 'a' , "tuple")

(* 要素のないタプル *)
()
 タプルの型は「*」で区切って表現されます。整数2つなら「int * int」ですし、整数と文字列なら「int * string」、intを取ってintを返す関数と整数なら「(int -> int) * int」です。要素が1個のタプルは存在しません。要素が0個のタプルはunit型と呼ばれ、「何も返す値がない」場合に用いられます。「unit」が「要素0個のタプル」を表す型で、「()」が要素0個のタプルの値です。
 タプルの中身は次のようにして取り出せます。
(* 要素が2つのタプルについて、最初の要素や2つ目の要素を取り出す関数 *)
let fst (f , s) = f;;
let snd (f , s) = s;;
 なお、上記ではfst及びsnd関数を「タプル取り出しのサンプル」として実装しましたが、これらの関数は最初から用意されていますので、実用する際には自分で実装する必要はありません。
 タプルが活用できる典型的な例としては、辞書型(いわゆる連想配列)があります。以下、非常に簡単な例を示します。ここではサンプルですから簡略化していますが、実際の連想配列では様々な高速化手段が講じられているのが普通です。
let rec find_hash (datas : ('a * 'b) list) (key : 'a) : 'b = match datas with
	| (k , v) :: xs when key = k -> v
	| x :: xs -> find_hash xs key
	| [] -> raise (invalid_arg "key not found.");;

Printf.printf "%d" (find_hash [("one" , 1); ("two" , 2);
	("three" , 3); ("four" , 4); ("five" , 5)] "three");;
 「('a * 'b) list -> 'a -> 'b」です。
 OCamlはHaskellより柔軟な言語ですので、何が何でもタプルに頼らなければならない状況は発生しにくいのですが、これはこれで便利です。
カテゴリ [開発魔法][社会問題] [トラックバック 0][コメント 0]
<- 前の記事を参照 次の記事を参照 ->

- Blog by yamicha.com -