さらにレコード
「プログラミングの基礎」の目標であるメトロネットワーク最短路問題にレコードを応用する。
必要な情報の定義
まず、メトロネットワークの構造のうち、駅名を定義する。
駅名の情報は
- 駅名
- ひらがな
- ローマ字表記
- 所属する路線名
の4つの情報を持つレコード型とする。
まずは、駅名の情報を格納するレコード型stationを作る。
type station = { name : string; (* 漢字駅名 *) kana : string; (* かな駅名 *) romanAlph : string; (* ローマ字駅名 *) route : string; (* 路線名 *) }
次に、station型のデータを受け取ったら「路線名、駅名(かな)」の形式で文字列を返す関数を作る。
#use "8-5.ml" (* 駅名情報 *) let ekimei1 = {name = "茗荷谷" ; kana = "みょうがだに" ; romanAlpha = "myougadani" ; route = "丸ノ内線"} let ekimei2 = {name = "渋谷" ; kana = "しぶや" ; romanAlpha = "shibuya" ; route = "銀座線"} let ekimei3 = {name = "大手町" ; kana = "おおてまち" ; romanAlpha = "otemachi" ; route = "千代田線"} (* staion型のデータを整形して文字列で返す *) (* display : station -> string *) let display station = match station with {name = n ; kana = k ; romanAlpha = a ; route = r} -> r ^ ", " ^ n ^ "(" ^ k ^")" (* テストコード *) let test1 = display ekimei1 = "丸ノ内線, 茗荷谷(みょうがだに)" let test2 = display ekimei2 = "銀座線, 渋谷(しぶや)" let test3 = display ekimei3 = "千代田線, 大手町(おおてまち)"
続いて、駅間の距離情報を格納するレコード型distanceを作る。
- 起点の駅
- 終点の駅
- 経由する路線
- 起点ー終点間の距離
- 所要時間
(* 駅間の接続情報を格納するレコード型 *) type distance = { dep : string; (* 起点の駅名 *) arr : string; (* 終点の駅名 *) pass : string; (* 経由する駅 *) time : int; (* 所要時間(分) *) }
たくさんのデータをまとめて扱うための構造データ「リスト」は次章。