○前提・実現したいこと
プログラミングの基礎という初心者向けのOcamlの教材でメトロネットワークを作る問題をしていたのですが理解できないところがあります。
駅間リストのデータから情報を取り出す関数 get_ekikan_kyori を作り、駅名を二つ受け取ってその間の距離を返すというものです。
get_ekikan_kyori "茗荷谷" "新大塚" global_ekikan_list
で 1.2 を返すなどです。 直接繋がっていない時にはinfinityを返します。
type ekikan_t = { kiten : string; (* 起点 *) shuten : string; (* 終点 *) keiyu : string; (* 経由路線名 *) kyori : float; (* 距離 *) jikan : int; (* 所要時間 *) } let global_ekikan_list = [ {kiten="代々木上原"; shuten="代々木公園"; keiyu="千代田線"; kyori=1.0; jikan=2}; {kiten="代々木公園"; shuten="明治神宮前"; keiyu="千代田線"; kyori=1.2; jikan=2}; {kiten="明治神宮前"; shuten="表参道"; keiyu="千代田線"; kyori=0.9; jikan=2}; {kiten="表参道"; shuten="乃木坂"; keiyu="千代田線"; kyori=1.4; jikan=3}; {kiten="乃木坂"; shuten="赤坂"; keiyu="千代田線"; kyori=1.1; jikan=2}; {kiten="赤坂"; shuten="国会議事堂前"; keiyu="千代田線"; kyori=0.8; jikan=1}; {kiten="国会議事堂前"; shuten="霞ヶ関"; keiyu="千代田線"; kyori=0.7; jikan=1}; let rec get_ekikan_kyori eki1 eki2 lst = match lst with [] -> infinity | {kiten = k; shuten = s; keiyu = y; kyori = r; jikan = j} :: rest -> if (eki1 = k && eki2 = s) || (eki1 = s && eki2 = k) then r else get_ekikan_kyori eki1 eki2 rest (* テスト *) let test1 = get_ekikan_kyori "茗荷谷" "新大塚" global_ekikan_list = 1.2 let test2 = get_ekikan_kyori "茗荷谷" "池袋" global_ekikan_list = infinity let test3 = get_ekikan_kyori "東京" "大手町" global_ekikan_list = 0.6
パターンマッチを使うときは先頭のリストと残りのリストに分けてfirstとrestというパターン変数を使ってアクセスするらしいです。
片方の距離だけなので駅1が始点と終点でif (eki1 = k && eki2 = s) || (eki1 = s && eki2 = k)、
then rで距離を返すのは分かるのですが、なぜelseでrestが出てくるのかがわからないです。
それとパターンマッチでfirstではなく{kiten = k; shuten = s; keiyu = y; kyori = r; jikan = j}を代わりに使ってる理由も教えていただきです。
そもそもなぜ、リストは、first(最初の要素) とrest(その残りの要素)に分けているのでしょうか?
どなたかご存知の方教えていただけたら助かります、、、
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/31 03:15
2021/08/31 04:03
2021/08/31 05:55
2021/08/31 06:03 編集
2021/08/31 06:17 編集
2021/08/31 06:29
2021/08/31 06:37 編集
2021/09/01 04:54
2021/09/01 05:07
2021/09/01 05:17
2021/09/01 06:00
2021/09/01 06:41
2021/09/01 06:49
2021/09/01 11:14