top page > computer > web > rfc > x_690 > 8_1_common > coding > existential > decode_rule.html
更新日:
文責: 重城良国

X.690: ASN.1のBER方式の共通部分の存在型を利用したコーディング: デコードルールをクラス関数にする

AsnableNg2.hs testAsnableNg2.hs

動機

ルールをクラス関数にする動機

デコードルールの作成を警告できる

今までの作りだと、ある型をASN.1でデコードする場合、Asnableクラスのインスタンスにするだけでは不十分である。その型用のデコードルールを作成する必要がある。もしも、デコードルールをAsnableクラスのクラス関数にしておけば、デコードルールを作成するように処理系が警告してくれる。

名前を節約できる

複数の名前空間を使えば、名前を贅沢に使うことは可能だ。しかし、それでも名前を節約することには価値がある。rawRule, recRule, boolRule, instanceRuleといった型ごとの名前を使うよりも、decodeRuleというクラス関数で名前をまとめておくのは省資源の観点から好ましい。

ルールをクラス関数にすることの欠点

ルールをクラス関数にすることは、必要なことではなく、本質的なことでもない。また、使用する際にはdecodeRule (undefined :: Integer)のような形で余分な引数が必要になりタイプ量が増えてしまう。

やってみる

どっちか迷ったら、とりあえずやってみる。やってから考えれば良い。

Asnableクラスへの追加

class Asnable a where
	...
	decodeRule :: a -> Rule
	...

既存の型にdecodeRule関数を追加する

基本的な型にdecodeRule関数を追加

instance Asnable RawBytes where
	...
	decodeRule _ = Rule rawBytesRule
	...
instance Asnable Raw where
	...
	decodeRule _ = Rule rawRule
	...
instance Asnable RawConstructed where
	...
	decodeRule _ = Rule recRule
	...

関数recRuleでRaw型を扱わないようにする

recRule :: RuleType
...
recRule _ (Asn1Tag Universal Primitive 0) Nothing =
	fail "Bad end-of-contents"
-- recRule _ t@(Asn1Tag _ Primitive _) (Just l)の部分を削除 
-- 次のパターンマッチにConstructedを追加 
recRule r t@(Asn1Tag _ Constructed _) (Just l) = Just $ do
...

追加の型にdecodeRule関数を追加

処理系からの警告を参考にしてdecodeRule関数を追加していく。

instance Asnable a => Asnable [a] where
	...
	decodeRule _ = Rule sequenceRule
	...
instance Asnable Bool where
	...
	decodeRule _ = Rule boolRule
	...
instance Asnable Instance where
	...
	decodeRule _ = Rule instanceRule
	...

「エンコード用のデータ型」へもどる 「モジュールに分ける(工事中 10%)」へ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics