Atelier λ

Knct-SG 2nd

概要

熊本高専で人を集めて行なっているゆるふわ勉強会の第二回がありました
第一回に比べ、人も増え、スクリーンも使えたので充実でした
次回はお菓子でも用意しようか?というところです(笑)

数式を構文解析した話

  • by @y1r96氏

数式を構文解析した話 from y1r96

  • pythonすごい
  • 前回がパーザーの説明、今回が電卓
  • 今後はshellでも作るのかな?(期待)

彼女とゲーセンに行った時に役立つ豆知識

  • by @null_poga氏
  • リンクなし
  • ゲーセン筐体は実はPS2だとか筐体って高いよねっていう話
  • 面白かったけど果たして彼女に話してひかれないのか?

かたとろんりがくとしょうめい

  • by me(@lmdexpr)
  • 次回はどうにか進捗を持っていきたい
  • OSの話とかしたいよねっていう
  • 1回目がラムダ計算, @長崎がラムダ計算処理系, 今回がこれなので……
  • 次回はこういう話から一回離れる予定ではあるので乞うご期待

追記

プレゼン内で「Cでの直和型の例はenumだ」という記述がありますがより「直和」の感覚が伝わる共用体の方が適切であると思います。少し気になったので詳しく追記したいと思います。
そもそも「直和」「直積」とは何かですが、記号で示すならば「A×B」「A+B」という対応だと思います。これは感覚的にすぐ分かるでしょう。
では「何」が「積」なのか「和」なのかという点になりますが、ここで一旦直積型の例として出した構造体について話しましょう。
そもそも直積とはという話です。例えば集合についてならある二つの集合の元をそれぞれ組にしたものを元とする集合を直積集合と呼びます。
ここからはまた感覚的な話になりますが、型はある同種のものを元とした集合と見れそうです。つまり型は集合、値は元に対応してそうだなーという話です。
そうすると直積はなんらかのとりうる値の組み合わせ全てということになりそうですね。
つまり、値がn個ある型Tと値がm個ある型Sの直積T×Sの値はn×m個あることになります。
例えばここに値がl個ある型Uを考えると直積T×S×U(積とは言っても可換ではありませんよ。今回は関係ありませんが)の値は全部でn×m×l個になりますね。やった!積だ!という訳です。
では、直和なら?
また値の個数が和になっていればいいのでしょうか?なぜ共用体を考えるのでしょうか?
列挙型は型を作るような構文です。その点で構造体と並べたかったのですがしかし列挙型は完全に型だけでなく値も作るような構文ですね。(間違ってるよ!とかは歓迎ですがあくまで感覚的な補足であるという点を一応保険として再度言っておきます)
構造体も共用体も既存の型を組み合わせていますね。それに共用体も型を作る構文と言えそうです。プレゼン資料制作時はその存在自体を忘れていたためにこの補足がある訳ですが……。
では数を見ましょう。型やその個数は直積の時と同じとして、T+Sの値はどうなるでしょうか。
おっと、その前に集合での直和を見ておかねばなりませんね。集合では「互いに交わらない、つまり共通部分が空集合であるような二つの集合の和集合」であるとのこと。
幾つかの型があって、その型のどれかを取るような時にそれらが共通部分を持つことってあるんでしょうか?
まぁ、ないですよね。だって「型が違う」んですから。C言語プログラマにはない感覚かもしれません。「intだってdoubleだって数字だろ!もっと言えばdoubleとfloatならどうだ!」とか。
それを実装する機構がHaskellでは型クラスな訳ですが、それは多相型であるだけでそいつらが似た型だなんてHaskellは知らないんですよ。
とにかく異なる型を幾つかとるなら直和になりそうです。では、個数はどうでしょう。ちなみに直和の時だけS,T,Uは全然別の型ですよ。もちろん直積なら同じでも構いません。あしからず。
S+Tは、うーん、もうちょっと具体的に考えてみた方がいいのかもしれません。例えば仮にBool型とChar型ならどうでしょうか。ついでに面倒にならないようにこのChar型は小文字アルファベットしかないことにします。誰が使うんでしょう。
直積はある型、もしくは別の型を取るような型でした。とするとその型がBoolであった場合、取りうる値の個数は2ですね。Char型(小文字アルファベットだけの)の場合なら26です。
合わせて取るかもしれない個数は28ですね。おや、ちゃんと和になっているようです。
ここまで来ると一般化しても大丈夫そうです。つまりT+S+Uはn+m+l個の値を取りうると言えます。
あー、良かった良かった。ここまでくればunionが対応してくれることは分かりますね。では、enumだと間違いなのですか、とか思いません?
正直言ってC言語上だと怪しいのかなという気もします。が、enum Bool {True, False};とした時の話です。
この値は僕が勝手に決めた定義ですから型はありませんね。ではこれらは無名の型に属していて、それにあえてTとFと名付けるとどうでしょう。
このBool型はTとFの直和であるようにも見えてきますね。そして、TとFの個数は両方1です。よってBoolの個数は1+1……

これはちゃんと直和になっているではありませんか!
つまりunionがCでの直和型であり、enumは直和型の特殊化されたものであると言えそうですね。
ここで補足は終わりです。以外と長くなってしまいましたので、後日、別の記事にまとめるかもしれません。

and more

  • 土壇場で話してくれたクラスメート、前日に無茶振りした後輩にありがとう

次回について

  • 良い流れできてるから人数増えていくと良い
  • 先生も巻き込みたい
  • いっそ部活にしてしまうのも一つの手か?
  • 次回は前期末テスト後にまた熊本高専HI3教室にて開催予定
    • 私の母のアップルパイを持っていくかも?

サイト制作開始!?

  • yesodとか使って作ろうかなーと
  • repo: https://github.com/lmdexpr/ksg-site
    • こんなサイト作ってる暇あるならバイトしろ