星田さんの記事に対するコメント。
Letを使って再帰部分を束縛して再利用・・・随分前にLetの束縛宣言?内で再帰を回してるのを見て驚いた事があったけど普通のことなんですねぇ・・。なんか不思議な感じがするなぁ
うん、でもこの関数の場合はこう書いた方が簡単かもしんない。
パターンマッチングについて曖昧だな・・と思ったので、教科書で表記法のおさらいをした後(ー>が曖昧だったので)、同じようなものがSchemeで無いのか?と検索すると・・今夜は宿直なのでこれをやってみよう!と。宿直に教科書を持ち込むのは面倒なんでね・・
が・・いざ読み始めてみると・・「思てたんとちゃう」というヤツだった。名前は一緒だけどOcamlのとは別じゃないか。
うん、そうね。
パターンマッチってのが一躍有名になったのはPrologって言語から、なんだけど、OCamlみたいなモダンな言語で言うトコの「パターンマッチング」ってのとはちょっと毛色が違うかも。
例えば「太郎はコーヒーが好き」「太郎はココアが好き」「花子は紅茶が好き」
と言う「事実」を列挙してPrologに読み込ませる・・・これは一種のデータベース形成で、インタプリタ側に変数Xを使って質問すると、太郎は「コーヒー」や「ココア」が好きだ、と言う結果、そして花子は「紅茶」が好きだ、と言う結果を返してくれて、これがProlog流の「パターンマッチング」になります。
つまり、変数Xが一体どういうパターンに適合するのか、探してくれる。
そういう、一種のデータベースへの問い合わせを「パターンマッチ」で解消してくれる、と言うのがPrologの特徴です。
これはOCamlなんかの「パターンマッチ」とは明らかに毛色が違う。
ちなみに、Prolog流の「パターンマッチ」の実装に関しては実用Common Lispの第5章辺りからトピックがはじまって、実際Prologの実装に向けて話が深まっていきます。
一方、OCamlのパターンマッチは実質上、「ちと複雑なcase構文」と言った性質になる。
つまり、
- データ「形式」を受け取る
- データがどういう要素を「パターンとして」含んでるのか判別する。
- それに従い結果を返す。
と言うようなカンジ。
例えば1とか2とか言う「具体的なデータ内容は」問わない。あくまで一般的に「形式がどういう形式なのか」パターンを記述してそれを判別の頼りにする。
あくまでそういうカタチでのパターンマッチングになる。
例えば、
と言うようなパターンが列挙されていた時、実装的には、Gaucheだと
Racketだと、
みたいになります。
個人的にはRacketの方がOCamlの記述形式に近くて明解かな、とか思うんだけど、その辺は好みかなぁ。
しょうがないのでKindleで例のPythonで数学のやり直しの本の続きを少し。よく考えたらグラフを描く部分を飛ばしてもそれほど問題が無いな。
あれ?Rangeって無いのか・・という訳で適当に作ったりして進んでいくのでありました。
えっ!そうなんだ(・。・;
はい。
だからCommon Lisperの大方が「Lispは関数型言語じゃない」と言う根拠になってたりする。何故ならLispは「多値を返せる」から。出力値が2つ以上でも構わない、と言う事をLispが非関数型言語だ、と言う根拠にしてる。
なお、「入力する値が決まると出力値が1つに決まる」事を、プログラミング用語では参照等価性と呼んだりします。