読者です 読者をやめる 読者になる 読者になる

さらにレコード

「プログラミングの基礎」の目標であるメトロネットワーク最短路問題にレコードを応用する。

必要な情報の定義

まず、メトロネットワークの構造のうち、駅名を定義する。


駅名の情報は

  • 駅名
  • ひらがな
  • ローマ字表記
  • 所属する路線名

の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;    (* 所要時間(分) *)
}


たくさんのデータをまとめて扱うための構造データ「リスト」は次章。