02/08/20 15:52
関数型言語の素人のコードなので変かも知れませんが大体こんな感じになります。
本できたら、このスレッドに報告してくださいね、買います。
type Token = String
type Key = String
type Field = String
type Value = String
hoge_key = [ "Name" , "Title" , "Address" ]
hoge_token = [ "Name" , ":" , "Yamada" , "Taroh" , ";" , "Title" , ":" , "Mr" , ";" , "Address" , ":" , "Tokyo" , "Shinjuku" , ";" ]
-- ここが本体
func :: [Key] -> [Token] -> [(Field, Value)]
func k t = receive [] t
where
receive xcomplete remain
| remain == [] = xcomplete -- 全部完了
| nokey = receive xcomplete raw_recs -- キー無し
| otherwise = receive (rec:xcomplete) raw_recs -- 成功
where
-- 先頭レコードのその以外のレコードの定義
( raw_rec , raw_recs ) = sprit_records remain
-- キーと ':' と結合前の値のリスト定義
-- 必要ならコロンのチェックをすること
( key : ( colon : value_token ) ) = raw_rec
-- キーがあるかどうかの定義
nokey = (has_member k key) == False
-- 値の定義
value = cat_value value_token
-- 整形済みレコード
rec = ( key , value )