Monthly Archives: 2月 2013

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

Posted on by 0 comment

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

第13章 一般化と高階関数

  • 13.2 関数の一般化とmap
    • map_sqrtはlstを省略して以下のようにも書ける

      # let map_sqrt = map sqrt;;
      val map_sqrt : float list -> float list = <fun>

    • 引数に渡す関数は無名関数を書くことが多い
    • 問題 13.2は↓のようなかんじ?

      let person_namae lst = map (fun person_t -> person_t.namae) lst;;

  • 13.3 多相型と多相関数
  • 13.4 値としての関数
  • 13.5 関数を返す関数
    • 問題 13.5

      # let twice f =
      let g x = f (f x)
      in g ;;
      val twice : (‘a -> ‘a) -> ‘a -> ‘a = <fun>
      # twice twice;;
      – : (‘_a -> ‘_a) -> ‘_a -> ‘_a = <fun>

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

Posted on by 0 comment

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

第11章 自然数と再帰

  • 11.4 リスト上の再帰との違い

第12章 ダイクストラのアルゴリズム

  • 12.1 グラフ上の最短路問題
  • 12.2 ダイクストラのアルゴリズム
    • p.113 アルゴリズムのステップ3
      特定の終点までの最短路だけでよければ、終点がUに入ったところで処理を終了してもよいはず。
  • 12.3 アルゴリズムの正当性
    • p.114
      始点、終点両方から始めるなどのダイクストラ法のバリエーションもあります。
  • 12.4 プログラムにおける頂点と辺の定義
  • 12.5 駅名の重複の除去
    • p.119
      乗り換え駅を二つの駅と考えても処理は変わらないのに。説明が面倒になるから乗り換えは考慮しないことにしたのかな。

第13章 一般化と高階関数

  • 13.1 データの一般化
    • p.123 let count_A lst = count lst "A"
      countの定義を、let rec count seiseki0 lst = ... のように、引数の順番を変えて count : string -> gakusei_t list -> int にすれば、count "A" は、seiseki0が”A”に部分適用された gakusei_t list -> int を返すので、
      let count_A = count "A"
      で、count_Aを定義することができる。複数引数があるときは、どの引数が軸になりやすいかを考えて順番を決めるのも良いと思う。また、引数の順番をかえずに、名前を与える方法もある。

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

Posted on by 0 comment

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

第10章 再帰関数を使ったプログラミング

  • 10.4 パターンマッチつき局所変数
  • 10.5 ふたつのリストを結合する関数
  • 10.6 ふたつの昇順に並んだリストをマージする関数
    • 本体を作る段階では両方とも短くするパターンがなくなっている。first1 :: first2 :: merge rest1 rest2 と書けるのでは?
      マージソートでは比較結果がイコールのケースは通常書かない。
  • 10.7 駅名・駅間リストからの情報の取得

第11章 自然数と再帰

  • 11.1 自然数の構造
  • 11.2 自然数に基づいた再帰関数
    • 階乗:factorial
  • 11.3 ベキ乗を求める関数

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

Posted on by 1 comment

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

第9章 リスト

  • 9.6 テンプレートの複合
    • p.87 中ほど「横に横に延びすぎる…」
      確かにインデントが深くはなるが、p.87上のコードでは二つ目のmatchの次の行のインデントが深すぎ。一つ目のmatchと同様に考えれば、行頭空白6つので良いはず。
  • 9.7 駅名リストと駅間リストの整備
    • p.89 問題9.9
      きっとどこかからデータをもらって加工したんだろうね。kanaがひらがななのは元データがひらがなだったからかな。
    • p.90 問題9.10
      • 片方向データで両方向表現するが、メトロネットワークに逆方向がない路線は無い? 一般的な鉄道路線だと有ると思う。
      • 隣の駅との間だけなのに、keiyuってちょっと違和感

第10章 再帰関数を使ったプログラミング

  • 10.1 関数のネスト
  • 10.2 リストの中の最小値を求める関数
  • 10.3 局所変数定義
    • p.99 上のコード
      この場合は、

      let x = 3 and y = 4 in x + y ;;

      で良い。(本書でandはでてきていないが)

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

Posted on by 0 comment

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

第9章 リスト

  • 9.2 リストの構文と型
  • 9.3 リストとパターンマッチ
    • パターン変数
       実際にプログラムを書くときはfirstじゃなくて意味のある名前にする
    • p.77 ページ上部のコード
       Match_failureの括弧内の数字は何?インタプリタで実行すると毎回数字が異なる。
  • 9.4 再帰関数
    • p.79 2つ目のコードは式でif文を書かないで↓のようにできる。

      # let rec contain_zero lst = match lst with
      [] -> false
      | 0 :: rest -> true
      | _ :: rest -> contain_zero rest;;
      val contain_zero : int list -> bool = <fun>

  • 9.5 再帰関数に対するデザインレシピ
    • p.84 List.lengthは、open Listを実行すれば、モジュール名を省略できる。
    • List.lengthだけ書かれているが、existsもあるので、contain_zeroを自分で定義しなくてもリストからゼロを探せる

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

Posted on by 0 comment

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

第8章 レコード

  • 8.3 レコードとパターンマッチ
    • p.61 コード、既存レコードの指定要素だけ値を変えた、新しいレコードをつくる構文もあるので覚えておくと便利かも。
      {gakusei with seiseki = if t >= 80 then "A" else … (省略)}
  • 8.4 そのほかの記法
    • p.62 ドットを使ったフィールド参照は良く使う。デザインレシピのテンプレートに従うのもわかるが、レコードが使用されるのは必ずしも関数引数で渡されるときだけではないので、臨機応変に使用して良いと思う。
  • 8.5 ユーザによる型定義
    • p.63 中ほどのレコードの型の説明
      OCamlのマニュアルには、{ field-decl  { ; field-decl } } とあり、’;’はセパレータであって最後のフィールド宣言の後ろに’;’は不要。最後に’;’をつけたものが間違いといえるかはわからないが、実際の処理系(Objective Caml version 3.12.1)では、

      • つけてもつけなくてもエラーにはならない
      • タイプ宣言時につけてもつけなくても、インタプリタが返す表示にはついている
      • レコード定義時につけてもつけなくても、インタプリタが返す表示にはついていない

      というおかしな状態。

    • p.64 問題8.1, 問題8.2, 問題8.3
      三つとも同レベルの問題だと思うが、三つもあるのはなぜだろう?
      → 同じフィールド名が使用できないことを体験させるため? 値段とか名前とか。だから具体的なフィールド名ではなく、フィールドの意味として漢字で書いている?
  • 8.6 データ定義に対するデザインレシピ
    • p.66 l.1
      「成績の切れ目の点数もきちんと処理できるかテストしたいので…」とあるが、切れ目の片側と中間値のケースがあるだけで、切れ目前後のテストケースがないので、テストケースとしては問題あり。
    • p.67 問題8.4
      レベルとしては8.3で初めにでてきた例と同様だが、「デザインレシピにしたがって作れ」というところが重要なのだろうね。
  • 8.7 駅名と駅間の情報の定義

第9章 リスト

  • 9.1 リストの構造
    • p.70 空リストの’空’って、なんて読んでる? カラ? クウ?
      • 空文字列(カラモジレツ)の連想から、カラリスト
      • 空集合(クウシュウゴウ)の連想から、クウリスト
      • wikipediaには、「空文字列(くうもじれつ・からもじれつ)」とあった。空リストはなし
      • weblioでは、クウモジレツ、クウリストになっていた