Open12

F# で書籍「プログラミングの基礎」を読む

shikatanshikatan
  • 目標: 最低でも一日一章は読み進める。
  • 成果: OCaml から F# に読み替えた部分をここに記録する。
shikatanshikatan

第1章 はじめに

1.3 準備

ページ 内容 OCaml F#
p.004 インタプリタの起動 ocaml dotnet fsi
p.004 プロンプト # >
shikatanshikatan

第2章 基本的なデータ

2.1 整数

ページ 内容 OCaml F#
p.007 インタプリタの反応 - val it
p.008 余り mod %

2.2 実数

ページ 内容 OCaml F#
p.008 実数の四則演算 +. +
-. -
*. *
/. /
p.008 実数の計算結果 21.3333333333333321 21.33333333
p.009 実数の計算結果 1.99999999328787381 1.999999993
p.009 実数と整数の計算 This expression has type int but is here used with type float この式に必要な型は 'float' ですが、ここでは次の型が指定されています 'int'
p.010 infinity での除算の結果 0. 0.0
p.010 マイナス無限大 neg_infinity -infinity

2.3 文字列

ページ 内容 OCaml F#
p.010 日本語の入力 インタプリタの表示にバグあり
p.010 文字列の結合 ^ + (^ でも可能)[1]

2.4 真偽値

ページ 内容 OCaml F#
p.013 整数と実数の比較 This expression has type float but is here used with type int この式に必要な型は 'int' ですが、ここでは次の型が指定されています 'float'
脚注
  1. warning FS0062: This construct is for ML compatibility. Consider using the '+' operator instead. This may require a type annotation to indicate it acts on strings. This message can be disabled using '--nowarn:62' or '#nowarn "62"'. ↩︎

shikatanshikatan

第4章 関数の定義

4.2 関数定義の構文

ページ 内容 OCaml F#
p.020 関数名の先頭 小文字必須 小文字推奨[1]
p.020 関数の型の表示 int -> int = <fun> x:int -> int
p.020 関数の型の表示 int -> int -> int = <fun> x:int -> y:int -> int
p.021 関数の型の表示 int -> int = <fun> x:int -> int

4.3 関数の型

ページ 内容 OCaml F#
p.021 関数の型の表示 int -> int = <fun> x:int -> int
p.022 関数の型の表示 int -> int -> int = <fun> x:int -> y:int -> int
p.022 関数の型の表示 int -> int = <fun> x:int -> int
p.022 関数の表示 <fun> <fun:it@数値>[2]

4.4 型推論と型チェック

ページ 内容 OCaml F#
p.023 関数の型の表示 int -> int = <fun> x:int -> int
p.023 int 型の引数に実数を渡す This expression has type float but is here used with type int この式に必要な型は 'int' ですが、ここでは次の型が指定されています 'float'
p.023 実数の乗算 *. *
p.023 関数の型の表示 float -> float = <fun> x:float -> float
p.023 四則演算の型推論 演算子の種類で推論 演算子に渡されている項のデータ型で推論

4.6 関数定義に対するデザインレシピ

ページ 内容 OCaml F#
p.027 拡張子 .ml .fsx
p.027 コメント (*コメント*) //行コメント, (*コメント*)
p.029 ファイルの読み込み #use #load open Kyuyo ;;[3]
脚注
  1. https://docs.microsoft.com/ja-jp/dotnet/fsharp/style-guide/formatting#naming-conventions ↩︎

  2. 関数定義時は省略されているが 関数名 ;; で確認できた。 ↩︎

  3. OCaml の #use と違い変数の値がファイル読み込み時に表示されない。明示的に標準出力するならインタプリタを閉じて dotnet fsi ファイルパス の方がいいかも。 ↩︎

shikatanshikatan

第5章 条件分岐

5.2 条件分岐の構文

ページ 内容 OCaml F#
p.034 if 式の条件の型が bool ではない This expression has type int but is here used with type bool この式に必要な型は 'bool' ですが、ここでは次の型が指定されています 'int'
p.034 if 式の結果の型が異なる This expression has type string but is here used with type int if' 式のすべてのブランチは同じ型である必要があります 。この式に必要な型は 'int' ですが、ここでは型 'string' になっています。

5.5 条件分岐に対するデザインレシピ

ページ 内容 OCaml F#
p.040 実数の単項マイナス -. 実数 -実数
shikatanshikatan

第6章 さまざまなエラー

6.1 構文エラー

ページ 内容 OCaml F#
p.045 変数宣言 = の記入もれ Syntax error この場所またはその前にある構造化コンストラクトが不完全です 束縛内。'=' または他のトークンを指定してください。
p.045 if then の処理部分の書き忘れ Syntax error error FS0010: この場所またはその前にある構造化コンストラクトが不完全です if/then/else 式内
p.045 不適切な括弧の対応 Syntax error error FS0010: 予期しない シンボル ')' です 相互作用内。このポイントまたはその前にある構造化コンストラクトが不完全です、';'、';;'、または他のトーク ンを指定してください。
p.045 括弧の閉じ忘れ Syntax error: ')' expected, the highlighted '(' might be unmatched error FS0010: 予期しない シンボル ';;' です 式内
p.046 日本語 の使用 Illegal character (新) error FS0039: 値またはコンストラクター '新' が定義されていません。
p.046 日本語の使用 文字列の中でのみ使用できる。 制限なし。

6.2 未定義の変数

ページ 内容 OCaml F#
p.046 未定義の識別子 a の使用 Unbound value a error FS0039: 値またはコンストラクター 'a' が定義されていません。
p.046 未定義の識別子 A の使用 Unbound constructor A error FS0039: 値またはコンストラクター 'A' が定義されていません。

6.3 型エラー

ページ 内容 OCaml F#
p.047 引数の数が関数の定義より多い This function is applied to too many arguments, maybe you forgot a ';' error FS0003: この値は関数ではないため、適用できません。

6.4 実行時のエラー

ページ 内容 OCaml F#
p.048 0 で割る Exception: Division_by_zero. System.DivideByZeroException: Attempted to divide by zero.
shikatanshikatan

第7章 組とパターンマッチ

7.1 組の構文

7.2 パターンマッチ

p.052 束縛のインデント

OCaml
let add pair = match pair with
    (a, b) -> a + b ;;
F#
let add pair =
    match pair with
    (a, b) -> a + b ;;

p.052 match

OCaml
let add pair = match pair with
    (a, b) -> a + b ;;
F#
let add pair =
    match pair with
    | (a, b) -> a + b ;;
ページ 内容 OCaml F#
p.053 1 つのパターンで同じ変数を使う This variable is bound several times in this matching error FS0038: このパターンで 'a' が 2 回バインドされています
shikatanshikatan

第8章 レコード

8.2 レコードの構文

ページ 内容 OCaml F#
p.059 ラベルの不足 Some record field labels are underfined: tensuu seiseki error FS0764: 型 'FSI_0005.S' のフィールド 'tensuu' に割り当てが指定されていません[1]

8.3 レコードとパターンマッチ

ページ 内容 OCaml F#
p.060 int -> string string_of_int 値 string 値
脚注
  1. 未指定のラベルが複数ある場合、型定義時の順番で先頭の 1 つを表示。 ↩︎

shikatanshikatan

第9章 リスト

9.3 リストとパターンマッチ

ページ 内容 OCaml F#
p.076 不完全なパターンマッチ Warning: this pattern-matching is not exhaustive. Here is an example of a value that is not matched: [] warning FS0025: この式のパターン マッチが不完全です たとえば、値 '[]' はパターンに含まれないケースを示す可能性があります。
p.077 未指定なパターンの実行 Exception: Match_failure (, 6, -21) error FS0030: 値の制限。値 'it' は次のジェネリック型を持つと推論されました。 val it : '_a
p.077 不完全なパターンマッチ Warning: this pattern-matching is not exhaustive. Here is an example of a value that is not matched: _::_ warning FS0025: この式のパターン マッチが不完全です たとえば、値 '[_]' はパターンに含まれないケースを示す可能性があります。
p.077 リストの表示 _::_ [_]

9.5 再帰関数に対するデザインレシピ

ページ 内容 OCaml F#
p.084 リストの要素数 リスト.length リスト.Length
shikatanshikatan

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

10.2 リストの中の最小値を求める関数

ページ 内容 OCaml F#
p.095 int の最大値 max_int System.Int32.MaxValue
0.095 int の最小値 min_int System.Int32.MinValue