私は、値(多態性、何でもよい)を持つコントロールフローのデータに取り組んでいます。また、はに値がまだ良いかどうかを確認するバリデータ関数を持っていて、はに関数それは "値をリフレッシュする"(新しい値で新しいデータを返します)。タイプレベルでオプションのフィールドを使用してデータを表現するにはどうすればよいですか?
バニラHaskellでは、それは次のようになります。
data Refreshable = Refreshable | NotRefreshable
data Validatable = Validatable | NotValidatable
MyData (r :: Refreshable) (v :: Validatable)
私はちょうどそれだけRefreshable
でやった:私は実際に欲しい
data MyData a = MyData
{value :: a
,validator :: Maybe (a -> Bool)
,refresher :: Maybe (MyData a -> MyData a)}
は、これらのタイプがあります。 Validatable
でもやってみたいですが、コンストラクタに問題があります。ちょうどRefreshable
のために私は2つのコンストラクタを必要とします.1つは更新可能なデータ用で、もう1つは更新不可能なデータ用です。 validatableで、私は4コンストラクタを持つ必要があります! (リフレッシュ可能で有効性があり、リフレッシュ不可能で有効性があり、有効性があり、リフレッシュ不可能であり、リフレッシュ不可能であり、有効性がない)。後で別のオプションのフィールドが必要になったら想像してください。さらに悪いことに、変更されているフィールドを除いてほとんどすべてのフィールドが同じです。重複が多くあります。
私はまた、型式/タイプファミリで状況を修正しようとしました。
たとえば、MyData 'Refreshable 'NotValidatable
はRefreshable data => data
になります。MyData
をインスタンス化することもできますし、より具体的なデータとしてインスタンス化することもできます。
実際にはフィールドではないので、これも問題です。つまり、バリデータなしでデータを取得して、バリデーター(タイプレベルではない)と同じデータに変更することはできません。
おそらくXYの問題です。私は、より洗練されたアプローチは、Refreshable a
とValidatable a
のようなデータ型を作成し、それらをMyData
で構成することですが、私はそれを行う方法を知らないと思う。順序がすべてを変えるので、私はそれらをラップすることはできません。
これを行うにはきれいな方法がありますか?または私はちょうど4コンストラクタに固執する必要がありますか?またはおそらくハスケルはこのタイプのものの準備が整っていないでしょうか? (意図された馬小屋はありません:P)。
ああ賢いです!私はそれがうまくいくと思います、今しようとします。 – MasterMastic