假设定义了以下数据类型:
data X a = X {getX :: a}
data Y a = Y {getY :: a}
data Z a = Z {getZ :: a}
必须有三个独立的函数,getX
,getY
和getZ
?在我看来,可能有一个函数定义如下:
get :: forall (τ :: (* -> *)) (a :: *). τ a -> a
get (_ x) = x
显然这不是有效的标准 Haskell,但是 GHC 有很多扩展,看起来他们可能有解决方案(、、、RankNTypes
等ExistentialQuantification
)DataKinds
。除了避免少量键入的简单原因之外,还有避免记录解决方案产生的命名空间污染的好处。我想这实际上只是一个比使用这样的类型类更隐含的解决方案:
class Get f where
get :: f a -> a
然而,定义泛型函数似乎比类型类更有用,因为它是隐式定义的,这意味着它可以在更多地方使用,就像使用($)
or一样(.)
。所以我的问题分为三个部分:有没有办法做到这一点,这是一个好主意,如果没有,什么是更好的方法?