Monthly Archives: 1月 2013

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

Posted on by 1 comment

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

第7章 関数の定義

  • 7.1 組の構文
    • 問題7.1
      まだこの本では出てきていないが、平均を求めるのであれば、整数を実数にしたい。
  • 7.2 パターンマッチ
    • パターン変数
      仮引数のようなものなのでaやbじゃなくてもいい。
  • 7.3 構造データに対するデザインレシピ
    • 問題7.4

      # let chuten points = match points with
      ((x1,y1),(x2,y2)) -> ((x1+x2)/2,(y1+y2)/2);;
      val chuten : (int * int) * (int * int) -> int * int =
      # chuten ((1,2),(3,4));;
      – : int * int = (2, 3)

  • 7.4 パターンマッチの実行方法
  • 7章では出てこなかったが、パターンではいろいろなことができる。扱うのも組とは限らない。

    # let foo pair = match pair with
    | (1, s) -> “one”^s
    | (2, s) -> “two”^s
    | (_, _) -> “bye”;;
    val foo : int * string -> string =
    # foo (1,” scoop of icecream”);;
    – : string = “one scoop of icecream”
    # foo (3, ” bananas”);;
    – : string = “bye”

    のように定数と変数を組み合わせたり

    # let bar i = match i with
    | 1 -> “one”
    | 2 -> “two”
    | _ -> “other”;;
    val bar : int -> string =
    # bar 0
    ;;
    – : string = “other”
    # bar 1;;
    – : string = “one”

    のようにswitch文のようなこともできる。

第8章 レコード

  • 8.1 レコードの必要性
  • 8.2 レコードの構文
    • フィールド
      OCamlでは同じフィールドを持つ別のレコードの型はつくれない(はず)

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

Posted on by 0 comment

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

第5章 条件分岐

  • 5.6 真偽値を返す関数
    • p.41 中ほど
      テストに境界前後値が無い。14, 26 のテストもすべき。4.6でもテストとして失敗のケースがなかったし、この本のテスト項目は基本的な項目がおさえられていない?
    • P.42 下のプログラム例
      条件式の書き方、15 <= t は、t >= 15 の方が良い。常に主体(比較される値)を左辺に、比較の元を右辺に持ってくるほうが読みやすい。「15 は t 以下」より「t は 15 以上」の方が言いたいことを表している。
    • p.44 問題5.4
      判別式とは?
      二次方程式の公式、x = ( -b ± √(b2 – 4ac) ) / 2a の、b2 – 4ac 部分。この値が
      > 0 : 実数解 2つ
      = 0 : 実数解 1つ
      < 0 : 実数解 なし (虚数解 2つ)
      と判別できる。
  • 5.7 条件分岐の実行方法

第6章 さまざまなエラー

  • 6.1 構文エラー
    • p.45
      Ocamlのバージョンによって(?)、メッセージが多少異なっているようだ。Cygwin上のOcaml 3.12.1では、
      Error: Syntax error
      のように、頭に"Error:"がついている。
  • 6.2 未定義の変数
  • 6.3 型エラー
    • p.47
      型エラーのメッセージも、上記バージョンではちがった。

      # 3 + 2.5 ;;
      Error: This expression has type float but an expression was expected of type int
      #

  • 6.4 実行時のエラー
    • p.48
      ちなみに、3. /. 0. は、float = infinity になった。
  • 6.5 論理的なエラー
    • p.49 問題6.1 (2)
      問題の前提として、pi と r は定義済みだと思う。

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

Posted on by 0 comment

参加者 今井(読み手)、沼田(記)
範囲 pp 29の下から6行目 – 40

第4章 関数の定義

  • 4.6 関数定義に対するデザインレシピ
    • p.30 ページ上部のコード例
      失敗のケースがないとテストにならない
    • p.30 プログラムにおける定義の順番
      再帰の場合は書き方が異なる
    • 問題4.8 の関数定義

      足の数の合計=鶴の数*2+亀の数*4
            =(鶴と亀の総数-亀の数)*2+亀の数*4
            =鶴と亀の総数*2-亀の数*2+亀の数*4
            =鶴と亀の総数*2+亀の数*2
      なので
      亀の数=(足の数の合計-鶴と亀の総数*2)/2

      鶴と亀の総数=鶴の数+亀の数
      なので
      鶴の数=鶴と亀の総数-亀の数
         =鶴と亀の総数-(足の数の合計-鶴と亀の総数*2)/2
         =(鶴と亀の総数*2-(足の数の合計-鶴と亀の総数*2))/2
         =(鶴と亀の総数*2-足の数の合計+鶴と亀の総数*2)/2
         =(鶴と亀の総数*4-足の数の合計)/2

      関数の定義としてはこんなかんじ?
      let tsurukame turukamesousuu ashisousuu = (turukamesousuu * 4 – ashisousuu) / 2

第5章 条件分岐

  • 5.1 条件分岐の必要性
  • 5.2 条件分岐の構文
    • p.34
      elseは省略できない
  • 5.3 kyuyoの例
  • 5.4 式としてのif文
  • 5.5 条件分岐に対するデザインレシピ

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

Posted on by 0 comment

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

第4章 関数の定義

  • 4.1 関数定義の必要性
  • 4.2 関数定義の構文
    • p.20
      (後からでてくるかもしれないが)
      let 関数名 引数 … = 式
      は、
      let 関数名 = fun 引数 … -> 式
      の略記法。これを頭に入れておくと後々理解しやすいかも。
  • 4.3 関数の型
    • p.22 中ほど
      A -> (B -> C) の意味は、A型の引数を渡すとB -> C型の関数を返す型の関数という意味。カリー化関数になっている。カリー化関数は部分適用が容易で、例えば本文の例では、g 3 はgのxに3を部分適用した32 + y2 – 4 を返す関数を返す。
    • let g = fun x -> fun y -> x * x + y * y – 4
      と書くとカリー化関数であることがわかりやすいかも。funの入れ子は引数を並べることで略記できるので、
      let g = fun x y -> x * x + y * y – 4
      と書くことができ、さらにこれは
      let g x y = x * x + y * y – 4
      と略記できる。
  • 4.4 型推論と型チェック
    • p.23
      引数の型や戻りの型を明示的に指定する方法もある。
  • 4.5 関数の実行方法
  • 4.6 関数定義に対するデザインレシピ (p.29 下から7行目まで)
    • p.27 中ほど
      (** … *) で書きocamldocで処理する、ドキュメントコメントもある。
    • p.28 下から8行目 脱字
      (kyuuyo25 = 23850) → (kyuuyo 25 = 23850)

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

Posted on by 0 comment

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

第1章 はじめに

  • 1.3 準備
  • 1.4 参考となる資料

第2書 基本的なデータ

  • 2.1 整数
  • 2.2 実数
    • p.9 ベキ乗を求める関数
      なぜfloatにしか、ベキ乗を求める関数がないのだろう?
    • p.9 エラーメッセージ
      OCamlでコードを書くと、よく見るエラーメッセージ。
      ここの説明では定数だが、実際の場合は変数の型が一致しなくてエラーになったりするので、こんなにわかりやすくはない。
  • 2.3 文字列
  • 2.4 真偽値
  • 2.5 そのほかのデータ

第3章 変数の定義

  • 3.1 変数の必要性
  • 3.2 変数定義の構文
  • 3.3 変数の実行方法
    • 式は優先順位にしたがい前方から解釈されるので、(31 * jikyu)を計算する前に 21250 + 23800 が先に計算される。
  • 3.4 ほかの言語の変数との違い
    • Scalaの変数定義の場合、再代入不可のval(valueの略)と再代入可のvar(variableの略)がある。

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

Posted on by 0 comment

参加者 沼田(読み手)、今井(記)
範囲 奥付、pp.i-xiii、pp.1-4

奥付

  • 著者略歴

Computer Science Library 編者まえがき

  • 2008年3月記すとあるが、この本は初版2007年、初版第2刷2011年だから、編者前書きはこの本の版数とは関係ないようだ。

まえがき

目次

第1章 はじめに

  • 1.1 デザインレシピ
    • p.2 「デザインレシピ」という用語はなじみがないけど、一般的に使用されている言葉?
  • 1.2 使用する言語
    • p.3 l.12
      • 言語ごとに得意なアプリケーション分野があるはず。得意な分野だけを示して比較しているのはあまり信じられない。実際に得意な分野のアプリケーション開発案件が、全アプリケーション開発案件のどのくらいあるのだろう。
      • 実際の開発では、開発環境が充実しているか、開発規模(人数)、メンテナンス性などもろもろのことを考えて言語を選ぶ必要があると思う。
    • p.4 l.10
      • 「プログラミングの習得は関数型言語から初め…が良いとされています」とあるが、まえがき(p.v)によると、著者の大学ではCを教えてから教えているようだけど、なぜだろう?
      • 私たちは既に他言語の知識がいっぱいあるから、初学で関数型言語の経験はできないし良いかわからない。数行上の「Cでのプログラミングがとても楽になった」も、先にCを習得した人の話だろうし。実際のところどうなのかはとても興味がある。