はこれです:拡張記録(と思う)私は大体欲しい
data A = ...
data B = ...
data C = ...
class HasA t where
getA :: t -> A
class HasB t where
getB :: t -> B
class HasC t where
getC :: t -> C
だから私は、この(擬似コードは、次の)ような何か行うことができます。当然のことながら
a :: A
b :: B
x = mkRecord { elemA a, elemB b }
y = mkRecord { elemB b, elemA a }
-- type of `x` == type of `y`
を、唯一の適切なget
機能が動作上記の場合、getA
とです。
これはので、おそらくこのため、解像度が既に存在して新しい問題ではありませんように私はまた、次のような機能
slice :: Subset a b => a -> b
slice x = -- just remove the bits of x that aren't in type b.
add :: e -> a -> a ++ e
add e x = -- add an element to the "record" (compile error if it's already there)
のように私は感じると思います。私は、ソリューションが拡張可能である必要はないことに注意してください。対処する必要があるタイプの量は有限で既知ですが、もちろん拡張可能なものは傷つきません。
私が探している分野、つまりHListとextensibleのようなパッケージがいくつか見つかりました(私のレコードを並べ替えたいので拡張性があるかもしれません)。 Hackageのドキュメントでは少し失われているので、私が探しているものをおおよそ実現するサンプルコード(またはサンプルコードへのリンク)がほしいと思います。