- 1 名前:潜伏していた1 mailto:sage [02/02/16 16:55]
- 何とか生き残れました。
前スレ pc.2ch.net/test/read.cgi/tech/996131288/l50 関連 >>2 以降
- 396 名前:日曜Haskellerオヤジ [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 )
- 397 名前:日曜Haskellerオヤジ [02/08/20 15:53]
- 続きです
-- トークン分解と ';' の取り除き -- 末尾 ';' チェックはしていないので必要なら無限再帰防止策をとること sprit_records :: [Token] -> ( [Token] , [Token] ) sprit_records token = receive ( [] , token ) where receive ( x , (y:ys) ) | y == ";" = ( x , ys ) | otherwise = receive ( x ++ [y] , ys ) -- 空白を入れながら文字列の結合をする cat_value (x:xs) = receive x xs where receive complete remain | remain == [] = complete | otherwise = receive ( complete ++ " " ++ x ) xs where (x:xs) = remain -- キー名があるかどうかチェック has_member (key:keys) x | x == key = True | keys /= [] = has_member keys x | otherwise = False
|

|