5

Haskellで「コンストラクタエイリアス」を作成するのと同等のものを持つ方法はありますか? タイプに別の名前を付けることができるタイプエイリアスと同様に考えていますが、エイリアスされたタイプとしてあらゆる点で動作します。

私のユースケースは、モデリングしているいくつかのオブジェクトのプロパティとして割り当てられた時間を持っているシステムですUTCTime。これらのいくつかは「可変」時間である可能性があります。つまり、まだ時間が割り当てられていないか、割り当てられている時間が「可動」である可能性があります。だからMaybe UTCTime

ただし、一部のオブジェクトのみが可変時間です。他のものは、システムが定数として取らなければならない固定時間を持っています。現在特定の時間に割り当てられている時間変数は、固定時間と同じように処理されません。これは今示唆していEither UTCTime (Maybe UTCTime)ます; 割り当てられていない固定時間または可変時間のいずれかです。

ジェネリック型は、私がモデル化しようとしているものに非常によく適合しているように見えるので、それらを使用するのは自然なことです。しかし、 が何であるかは明らかEither UTCTime (Maybe UTCTime) ですが、それが何を意味するかは特に明白ではないため、説明的な特殊なケースの名前が適しています。

simpletype Timeslot = Either UTCTime (Maybe UTCTime)は間違いなく私の型シグネチャを大幅にクリーンアップしますが、コンストラクターには何もしません。値を構築bound = Justするための名前を取得するようなものを使用できますが、パターン マッチングには使用できません。

もう一方の端では、任意の名前でカスタム ADT を定義できますが、定義済みのEitherおよびMaybeタイプの機能がすべて失われます。というか、常に変換を前後に適用します (これはnewtype、効率の保証がない場合にのみ、物事にラッパーを使用する状況よりも悪くないと思いますが、とにかくこれがボトルネックになるとは思えません)。そして、ジェネリック関数EitherMaybe関数を使用して値を操作するコードを理解Timeslotするには、標準コンストラクターがとにかく使用したいものにマップされる方法を知る必要があり、変換関数は、そのマッピングの便利なコンパイラー強制定義を提供します。 . 結局のところ、これは良いアプローチかもしれません。

Haskell については、コンストラクターのエイリアシングのようなものは存在しないと言えるほどよく知っていると確信していますが、私が知らないハックや、この状況を処理する他の良い方法があるかどうかに興味があります。

4

2 に答える 2

4

「パターンシノニム」は ghc にマージされる可能性があります: http://ghc.haskell.org/trac/ghc/ticket/5144。それまでの間、-XViewPatterns もあり、次のようなものを記述できます。

type Timeslot = Either UTCTime (Maybe UTCTime)
fieldA = either Just (const Nothing)
fieldB = either (const Nothing) id


f (fieldA -> Just time) = ...
f (fieldB -> Just time) = ...
f _ = ...
于 2013-09-29T01:09:01.310 に答える