Category Archives: プログラミングの基礎

「プログラミングの基礎」第25回(4/16)

Posted on by 0 comment

参加者 沼田(読み手)、今井(記)
範囲 pp.255-266

第23章 副作用命令を使ったプログラミング

  • 23.3 ヒープへの挿入
  • 23.4 その他の操作
  • 23.5 ヒープのインタフェース
  • 23.6 副作用命令の影響について
  • 23.7 ヒープの実装の概要
    • p.262 l.9
      int refは配列の最後の要素にアクセスするためではなく、配列中で現在ヒープで使用している最後の要素の次の要素にアクセスするため。(配列の最後の要素だとlength nに対し常に.(n-1)の要素になると思う。)
    • p.262 問題 23.2
      「小さい順にリストに入っていくので、結果として大きい順に整列したリストを得ることができる」のはなぜ?
      → consでリストの頭につけていくということを、「小さい順にリストに入っていく」と言っているのだろう。

第24章 まとめ — プログラミングとは —

  • 24.1 OCamlを習得して
  • 24.2 この先の道

読了

 

 

「プログラミングの基礎」第24回(4/12)

Posted on by 0 comment

参加者 今井(読み手)、沼田(記)
範囲 pp.243 – 255

第22章 値の書き変えと参照透過性

  • 22.1 参照透過性
  • 22.2 呼び出し回数のカウント
    • p.245 fibの実装
      再帰呼出をする際、c0とかc1ではなく0を渡し、c0+c1+c2を返すようにすれば、inをつかわないで並列実行できるのでは?
  • 22.3 参照型と値の書き変え
  • 22.4 参照透過性の喪失
  • 22.5 変更可能なレコード
  • 22.6 配列
    • p.252 要素の呼び方
      配列の要素を「○番目」で呼ぶときにときに添え字が3のデータを3番目と呼ぶのは違和感がある。
      [|要素0; 要素1; 要素2; …; 要素n|]があり、要素iはi+1番目の要素なのでは?
  • 22.7 配列の変更

第23章

  • 23.1 ダイクストラ法におけるデータアクセス
  • 23.2 ヒープ

「プログラミングの基礎」第23回(4/9)

Posted on by 0 comment

参加者 沼田(読み手)、今井(記)
範囲 pp.229-242

第20章 モジュールの開発

  • 20.5 赤黒木のモジュール化
  • 20.6 open文

第21章 逐次実行

  • 21.1 副作用を持つ関数
  • 21.2 unit型
  • 21.3 逐次実行の構文
    • p.235 中程
      引数の式の値を無視する関数、

      # ignore;;
      – : ‘a -> unit = <fun>

      というのがあって、わかっていて副作用だけ使いたいときには使用すると良いです。

  • 21.4 実行中の変数の表示
    • p.236 GCDのコード
      m ≧ n を前提にしている? → m < n のとき (m mod n) = m だから、gcd n (m mod n) は最初の再帰で gcd n m になるので、OK。
  • 21.5 実行の順序
  • 21.6 スタンドアローンのプログラム
  • 21.7 引数の渡し方
    • p.214
      main関数のシグニチャが変わること(決まっていないこと)に違和感がある。→ CやJavaなどとは違いmainという関数名自体にも意味はない。

「プログラミングの基礎」第22回(4/5)

Posted on by 0 comment

参加者 今井(読み手)、沼田(記)
範囲 pp.221 – 229

第19章 モジュール

  • 19.6 ファイルの分割と分割コンパイル
  • 19.7 2分探索木モジュールの使用
    • OcamlMakefileはOcaml用のMakefile。
    • TreeモジュールのMakefileでSOURCESに.mliを書いているが必要?

第20章 モジュールの開発

  • 20.1 赤黒木
    • 黒の頂点しか現れていなければ完全にバランスした木になるのは何故?木の根から空の木に至るすべてのパスにおいて黒い頂点の数はおなじだから?
  • 20.2 赤黒木への挿入
  • 20.3 赤黒木の再構成
  • 20.4 「または」のパターン
    • 複数のパターンは改行して縦に並べることもできる。
    • balanceで赤の頂点が続くパターンをマッチングしているが、insertしたときに赤が続いたことを返してあげたほうが効率がよいのでは?

「プログラミングの基礎」第21回(4/2)

Posted on by 0 comment

参加者 沼田(読み手)、今井(記)
範囲 pp.211-220

第19章 モジュール

  • 19.1 モジュールの構文
    • p.213 19.1の最後
      「モジュールは、オブジェクト指向言語におけるオブジェクトに近いものと考えることもできます。」には違和感がある。
  • 19.2 2分探索木のモジュール
  • 19.3 モジュールインタフェース:シグネチャ
    • p.217 上のコード
      (Tree : Tree_t)のようにコロンの後にタイプを書く文法ってここまでに説明あった?
  • 19.4 抽象データ型
    • p.219 中程下
      この本では情報をコメントで書くことはよく推奨されているが、変数名や関数名などに適切な名前をつけることには触れられていない。何を表しているか、何をするかを表す適切な名前をつけることは重要だと思う。関数型言語では名前はあまり重要視されていない?
  • 19.5 そのほかのシグネチャの宣言法

「プログラミングの基礎」第20回(3/29)

Posted on by 0 comment

参加者 今井(読み手)、沼田(記)
範囲 pp.200 – 210

第18章 例外と例外処理

  • 18.3 オプション型を使った例外処理の問題点
    • 補助関数と関数の本体の両方にyasai_listという変数があるが、別物。
      →名前を変えたほうがわかりやすいのではないか。
  • 18.4 例外処理専用の構文
    • 例外処理構文のtryとwithにはさまれた式の返す型と、例外のパターンにマッチした場合に実行される式の返す型が一致していないとエラーになる。
  • 18.5 例外処理の実際
    • total_priceのコード例
      このhojoの場合は局所定義の関数だからわかるからよいのかもしれないが、使用している関数が例外をraiseする場合はどのようにコメントを書いておくのだろう?
    • 問題 18.4
      get_ekikan_kyoriでは最小値をみつけたいので、infinityのほうが使いやすいだろう。
  • 18.6 例外処理を使ったプログラミング
  • 18.7 最短路問題における例外処理

「プログラミングの基礎」第19回(3/26)

Posted on by 0 comment

参加者 沼田(読み手)、今井(記)
範囲 pp.191-200

第17章 再帰的なデータ構造

  • 17.6 停止性
  • 17.7 get_ekikan_kyoriの高速化
    • p.193 l.1
      なぜ、初めからLeaf無しでEmptyとNodeのみにしなかったのだろう?
    • p.193 問題17.3
      複数の駅間を挿入する関数なので、名前は inserts_ekikan より insert_ekikans の方がしっくりくる。
  • 17.8 全通りを尽くしていない場合の対処

第18章 例外と例外処理

  • 18.1 オプション型
    • p.199 上のコード
      matchで、| (item, nedan) :: rest -> のように、直接itemの値でマッチできるのではないか? → できませんでした。
  • 18.2 オプション型を使った例外処理
    • p.200 問題18.2
      ここだけではないけれど、「八百屋のリスト」は「八百屋にある野菜のリスト」だよね。「八百屋のリスト」だと八百屋さんのリストに感じて、なければ「八百屋のリスト」の次の要素の八百屋を探すのかと思ってしまった。
      kaimono_yasai_list と yaoya_yasai_list とか、kaimono_list と yasai_list などの方がわかりやすいと思う。

 

「プログラミングの基礎」第18回(3/19)

Posted on by 0 comment

参加者 今井(読み手)、沼田(記)
範囲 pp.180 – 191

第17章 再帰的なデータ構造

  • 17.2 木
    • 組:タプル
    • tree_t
      • Nodeの定義
        説明ではNode(left, n, right)となっていたのがNode(t1, n, t2)になっている。前者のほうがわかりやすいのになぜ?
      • Leafがなくても木はできるのでは?
        →Leafがあったほうがコンストラクタで型がわかるから使いやすい?空の木と枝のない木を別にしたい?
  • 17.3 再帰的なデータ構造に対するデザインレシピ
  • 17.4 2分探索木
    • insert_treeのような再帰関数では、最終的に返されるのは新しい木。参照を気をつけないと、間違えて書き換えてしまうことがある。
  • 17.5 多相型の宣言
    • p.190の下から2つ目のコマンド実行例
      search;;を実行した結果にvalがついているのは間違いでは?

「プログラミングの基礎」第17回(3/15)

Posted on by 0 comment

参加者 沼田(読み手)、今井(記)
範囲 pp.170-180

第16章 情報の蓄積

  • 16.3 アキュムレータの活用
    • p.172 コード下6行目
      再帰のたびに「lstの逆順のリストにresultをくっつけたものを返す」の下線部がピンとこない。
      rev rest (first :: result)で、lstの最初の要素(first)をresultにconsしたものをresultとし残りの要素(rest)をlstとして再帰することにより、lstの頭から1つずつresultにconsされるので、lstの逆順リストをresultにappendしたものになっている。
  • 16.4 最初の完動プログラム
    • p.175 l.14
      「再帰によるループは数学的帰納法の応用ととらえれば理解しやすく、」とあるが、そもそも数学的帰納法という言葉がわからない。関数型言語の説明では数学の知識があることが前提で書いてあることが多いが、そのような分野でしか有効に利用できない言語なのかと思ってしまう。
  • 16.5 プログラム作成のプロセス

第17章 再帰的なデータ構造

  • 17.1 バリアント型
    • p.180 コード
      let to_seireki : nengou = ...の’:’は何の意味?
      → たぶん衍字。コロンの後に型を明示する書き方もあるが、上記では文法的におかしいので単なる間違いだと思う。

「プログラミングの基礎」第16回(3/12)

Posted on by 0 comment

参加者 今井(読み手)、沼田(記)
範囲 pp.161 – 170

第15章 新しい形の再帰

  • 15.5 一般の再帰に対するデザインレシピ
  • 15.6 最短距離最短の点の分離
    • 問題15.4
      受け取るeki_t list型のリストは最短距離更新後のVなので最短距離をチェックして分離すればよい。
    • 問題15.5
      回答例はこちら
  • 15.7 例の作成とデバッグについて

第16章 情報の蓄積

  • 16.1 情報の欠落
  • 16.2 アキュムレータ
    • p.168 hojoの定義
      total0 +. kはinを使えば2回計算しなくていい
    • p.169 total_distanceの最終的な定義
      inで改行しておくと、グローバル関数と局所関数の呼出の書き方が一緒になるしわかりやすい。