Open12
F# で書籍「プログラミングの基礎」を読む
- 目標: 最低でも一日一章は読み進める。
- 成果: OCaml から F# に読み替えた部分をここに記録する。
第1章 はじめに
1.3 準備
ページ | 内容 | OCaml | F# |
---|---|---|---|
p.004 | インタプリタの起動 | ocaml |
dotnet fsi |
p.004 | プロンプト | # |
> |
第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' |
-
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"'. ↩︎
第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]
|
-
https://docs.microsoft.com/ja-jp/dotnet/fsharp/style-guide/formatting#naming-conventions ↩︎
-
関数定義時は省略されているが
関数名 ;;
で確認できた。 ↩︎ -
OCaml の
#use
と違い変数の値がファイル読み込み時に表示されない。明示的に標準出力するならインタプリタを閉じてdotnet fsi ファイルパス
の方がいいかも。 ↩︎
第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 | 実数の単項マイナス | -. 実数 |
-実数 |
第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. |
第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 回バインドされています |
第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 |
第10章 再帰関数を使ったプログラミング
10.2 リストの中の最小値を求める関数
ページ | 内容 | OCaml | F# |
---|---|---|---|
p.095 | int の最大値 | max_int |
System.Int32.MaxValue |
0.095 | int の最小値 | min_int |
System.Int32.MinValue |