<style>
/* basic design */
.reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6,
.reveal section, .reveal table, .reveal li, .reveal blockquote, .reveal th, .reveal td, .reveal p {
font-family: 'Meiryo UI', 'Source Sans Pro', Helvetica, sans-serif, 'Helvetica Neue', 'Helvetica', 'Arial', 'Hiragino Sans', 'ヒラギノ角ゴシック', YuGothic, 'Yu Gothic';
text-align: left;
line-height: 1.6;
letter-spacing: normal;
text-shadow: none;
word-wrap: break-word;
color: #444;
}
.reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 {font-weight: bold;}
.reveal h1, .reveal h2, .reveal h3 {color: #00a474;}
.reveal th {background: #DDD;}
.reveal section img {background:none; border:none; box-shadow:none; max-width: 95%; max-height: 95%;}
.reveal blockquote {width: 90%; padding: 0.5vw 3.0vw;}
.reveal table {margin: 1.0vw auto;}
.reveal code {line-height: 1.2;}
.reveal p, .reveal li {padding: 0vw; margin: 0vw;}
.reveal .box {margin: -0.5vw 1.5vw 2.0vw -1.5vw; padding: 0.5vw 1.5vw 0.5vw 1.5vw; background: #e4ffe5; border-radius: 1.5vw;}
/* table design */
.reveal table {background: #f5f5f5;}
.reveal th {background: #444; color: #fff;}
.reveal td {position: relative; transition: all 300ms;}
.reveal tbody:hover td { color: transparent; text-shadow: 0 0 3px #aaa;}
.reveal tbody:hover tr:hover td {color: #444; text-shadow: 0 1px 0 #fff;}
/* blockquote design */
.reveal blockquote {
width: 90%;
padding: 0.5vw 0 0.5vw 6.0vw;
font-style: italic;
background: #ddffff;
}
.reveal blockquote:before{
position: absolute;
top: 0.1vw;
left: 1vw;
content: "\f10d";
font-family: FontAwesome;
color: #00a474;
font-size: 3.0vw;
}
/* font size */
.reveal h1 {font-size: 5.0vw;}
.reveal h2 {font-size: 4.0vw;}
.reveal h3 {font-size: 2.8vw;}
.reveal h4 {font-size: 2.6vw;}
.reveal h5 {font-size: 2.4vw;}
.reveal h6 {font-size: 2.2vw;}
.reveal section, .reveal table, .reveal li, .reveal blockquote, .reveal th, .reveal td, .reveal p {font-size: 2.2vw;}
.reveal code {font-size: 1.6vw;}
/* new color */
.red {color: #EE6557;}
.blue {color: #16A6B6;}
/* split slide */
#right {left: -18.33%; text-align: left; float: left; width: 50%; z-index: -10;}
#left {left: 31.25%; text-align: left; float: left; width: 50%; z-index: -10;}
</style>
<style>
/* 背景デザイン */
.reveal {
background-color:/*背景色*/
#f8f8ff;
}
.reveal h1 {padding: 3.0vw 0vw;}
@media screen and (max-width: 1024px) {
.reveal h2 {margin: -2.0vw 0 0 0; padding: 0.0vw 0vw 3.0vw 2.0vw; }
}
@media screen and (min-width: 1025px) and (max-width: 1920px) {
.reveal h2 {margin: -1.5vw 0 0 0; padding: 0.0vw 0vw 3.0vw 2.0vw; }
}
@media screen and (min-width: 1921px) and (max-width: 100000px) {
.reveal h2 {margin: -1.0vw 0 0 0; padding: 0.0vw 0vw 3.0vw 2.0vw; }
}
</style>
<style>
/* specific design */
.reveal h2 {
padding: 0 1.5vw;
margin: 0.0vw 0 2.0vw -2.0vw;
border-left: solid 1.2vw #00a474;
border-bottom: solid 0.8vw #9e9e9e;
}
</style>
<!-- --------------------------------------------------------------------------------------- -->
# 第8章<br> レコード
<br>
<br>
#### 2021/10/19 & 10/26
### 本田 統哉
---
### 8.1 レコードの必要性
* 7章では組を( 〇、〇)というように表していたがどういう順番で組にしたか覚えとかなければならない。
* (〇、〇、〇)という形になった時に組の中の位置が変わってしまう恐れがある。
---
### 入力を逆にするとプログラムとしては正常に動くが答えとしては的外れになる。


---
## 8.2 レコードの構文
* (①,②,③)が(③,①,②)という形になっても平気なのがレコードという名前のついたデータの集まり。
* 組内の各データに名前がついており、それぞれのデータが何を表しているのかを明確にする。
* =={ 名前1 = 値1; 名前2 = 値2; ・・・}==
レコードを作るには上の構文を使用する。ここでいう名前のところがフィールドと呼ばれるもの。
---
### 順番を入れ替えても大丈夫


---
### フィールドの順番は変えられるがフィールドを省略してはいけない

---
## 8.3 レコードとパターンマッチ
* レコードの要素を取り出すときは以下のようなパターンマッチを使用する。
{ フィールド1 = パターン変数1;
フィールド2 = パターン変数2; ・・・}
---
### **gakusei_t**型のレコードを受け取ったら成績を通知する文字列を出力

---
### 出力

---
### string_of_int ...とは
* 整数の十進文字列表現を返すもので整数を文字列に変換してくれる。
* Ocaml に定義されている関数のひとつ。
---
### 別例:点数によって成績が変化する関数hyouka

---
### 出力

別

---
### 得られた結果をtsuuchi に渡す

しっかりと点数に対する成績が正しく表示される。
---
## 8.4 そのほかの記法
* gakusei_t 型のレコードのパターンは{namae = namae; tensuu = tensuu; seiseki = seiseki}と書くこともできる。パターン変数を考える必要がなくなるメリット。
---
### フィールドの値を取り出す別手段
* . (ドット)をレコードとフィールドの間に入れることでレコードの指定したフィールドの値になる。

---
## 8.5 ユーザーによる型定義
* レコードを使うときの型はOcaml で定義されていないので絶対に自分で新しい型を定義しなければならない。
* 新しい型を定義するには下のような構文、type 文を使う。
**==type 新しく定義する型の名前 = その型の定義==**
---
### 実際に定義してみると正しく表示

###### ※ フィールド名は小文字で始まる必要がある
---
### 定義しないまま出力しようとするとエラー

---
## 8.6 データ定義に対するデザインレシピ
* ==データ定義== 入力データの型、出力データの型を考える。それらが構造を持つならその型を定義。他の型に埋め込まないようにする。
* ==テンプレート== 入力の一部が構造データの場合は、その中身を取り出すmatch 文を作る。その際にテストプログラムを実行しmatch 文の構文があるか確認。
---
## ① データ定義(関数hyouka の例)
学生のデータを受け取った後に学生のデータを表す型が必要なのでレコード型として以下のデータ定義を作る。

---
## ② 目的
返す値はがgakusei_t 型なので空文字列と0 からなる架空の学生データを使ってヘッダを作る。

---
## ③ 例

---
### ③
* 今回は学生のデータである点数を受け取って成績を出すというものなので成績の境目の点数も正しく処理されているかを確認する。

---
## ④ テンプレート
このプログラムは入力としてgakusei_t 型のレコードを受け取るのでレコードの中身を取り出すmatch 文を挿入する。

---
## ⑤ 場合分けを行うif 文
ここで学生の点数に対する成績を場合分けするif 文を作る。

---
## ⑥ 本体
各場合を順に埋めていく。

---
### 終わり
{"metaMigratedAt":"2023-06-16T13:12:00.470Z","metaMigratedFrom":"YAML","title":"8章","breaks":true,"slideOptions":"{\"theme\":\"white\",\"slideNumber\":\"c/t\",\"center\":false,\"transition\":\"none\",\"keyboard\":true,\"width\":\"93%\",\"height\":\"100%\"}","contributors":"[{\"id\":\"a0de3d6a-cf71-4961-a3bb-e324e7c21a77\",\"add\":7148,\"del\":1154}]"}