Monthly Archives: 3月 2013

「プログラミングの基礎」第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で改行しておくと、グローバル関数と局所関数の呼出の書き方が一緒になるしわかりやすい。

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

Posted on by 0 comment

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

第15章 新しい形の再帰

  • 15.2 部分問題の生成
    • p.154 take_less, take_greater
      これだと同じリストを二回走査しないといけない。今回の目的では一度走査してless, greater両方のリストのタプルを返す関数でも良いと思う。
    • p.155
      このアルゴリズムだと与えられたリスト中に、基準の要素と同じ値の要素があるとその要素が結果リストに入らない。
  • 15.3 補助関数の作成
    • p.156 下のコード例
      filterは、List.filterとするか、open Listをしておかないと使えない。
    • p.157 中ほどの本文
      (・・・)でくくってinfix関数に変換… → (・・・)でくくってprefix関数に変換…
    • p.157 下のコード例
      inの位置が気持ち悪い。その上の関数が局所関数なのだから、上の関数の行末についているほうが意味的にわかりやすい。
    • p.157 問題15.1
      >=<=も()でくくればprefix関数になる? → 試したらOKでした。
  • 15.4 停止性の判定
    • p.158 下方のクイックソートの例の停止性判定
      前頁までのコードでは再帰のパラメータに別の関数take_less, take_greaterの結果を使っているので、take_less, take_greaterが与えたrest以下のサイズであることも知らないと、再帰のたびにリストの長さが減るとは言えない。
    • p.159 l.8
      自然対数 e → 自然対数の底 e
  • 15.5 一般の再帰に対するデザインレシピ

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

Posted on by 0 comment

参加者 今井(読み手)、沼田(記)
範囲 pp 142 – 151

第14章 高階関数を使ったリスト処理

  • 14.3 局所関数定義
  • 14.4 名前のない関数
    • 大きい関数はわかりづらくならないように局所定義するが、mapに渡すような小さな関数は無名関数を使うことが多い。
    • 問題14.12
      問題14.11で作成した関数との関係は「ない」という答えでよい?
  • 14.5 infix関数とprefix関数
  • 14.6 完全数を求める関数

第15章 新しい形の再帰

  • 15.1 再帰関数の構造
    • リスト構造の上にできあがっている再帰
      空リストではなく、要素1コのリストにしないのは何故だろう?再帰1回分処理が無駄なのでは?
      →リストを受け取って処理をする関数なので、空リストとそれ以外に場合分けするのだろう。

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

Posted on by 0 comment

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

第13章 一般化と高階関数

  • 13.6 確定点に隣接する点の最短距離の更新
    • p.134 上の処理手順
      • Vに入っている点でループするのではなく、点pにつながっている点でループして、Vに入っているかを調べるのとは、どちらが効率がいいのだろう?
      • ループの最初で、点pにつながっているか(や、上記でVに入っているか)を調べる前に、「最短距離がp経由の方が小さいか」を調べるほうが、リストを走査する回数が少なくなって良いかも。
      • リストを走査する処理って、コストは高いの?

第14章 高階関数を使ったリスト処理

  • 14.1 条件を満たす要素を取り出す関数
    • p.136 3つ目のコード
      let rec filter p lst = の ‘p’ って、何の略だろう?
      → predicate. OCamlのList.filterの説明によると、

      filter p l returns all the elements of the list l that satisfy the predicate p.

  • 14.2 各要素をまとめあげる関数
    • p.140 図14.1
      Lispのリストの説明では、よくこんな絵がかいてある。

      listの絵