Jac*_*ole 2 haskell types data-kinds
假设定义了以下数据类型:
data X a = X {getX :: a}
data Y a = Y {getY :: a}
data Z a = Z {getZ :: a}
Run Code Online (Sandbox Code Playgroud)
必须有三个独立的功能,getX,getY,和getZ?在我看来,可能有一个函数定义如下:
get :: forall (? :: (* -> *)) (a :: *). ? a -> a
get (_ x) = x
Run Code Online (Sandbox Code Playgroud)
显然,这不是有效的标准哈斯克尔,但也有GHC这么多的扩展,看起来他们可能有一个解决方案(RankNTypes,ExistentialQuantification,DataKinds等).除了避免少量键入的简单原因之外,还有避免记录解决方案创建的命名空间污染的好处.我想这实际上只是一个比使用这样的类型类更隐式的解决方案:
class Get f where
get :: f a -> a
Run Code Online (Sandbox Code Playgroud)
然而,似乎定义一个通用的功能会比一个类型的类更有用,因为它是隐含定义的事实意味着它可以在更多的地方使用,以同样的方式,($)或(.)使用.所以我的问题有三个部分:有没有办法实现这个目标,这是一个好主意,如果不是,那么更好的方法是什么?
Ben*_*son 10
这种类型怎么样?
newtype Pred a = Pred (a -> Bool)
Run Code Online (Sandbox Code Playgroud)
还是这一个?
data Proxy a = Proxy
Run Code Online (Sandbox Code Playgroud)
没有办法摆脱a困境Pred a.你只能把aS IN.同样,有没有办法得到一个a出来的Proxy a,因为没有任何a在它里面秒.
所以功能get :: forall f a. f a -> a一般不存在.您需要使用类型类来区分f可以从中提取的类型和不能从中提取的类型a.