作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个类型类:
data Proxy a = Proxy
class Fixed a where
fixed :: Proxy a -> Int
fixed
的定义非常简单,所以我使用 GHC.Generics
推导它:
class GFixed f where
gfixed :: Proxy (f a) -> Int
instance (GFixed f, GFixed g) => GFixed (f :*: g) where ...
instance (GFixed f, GFixed g) => GFixed (f :+: g) where ...
instance GFixed f => GFixed (M1 i c f) where ...
instance Fixed a => GFixed (K1 i a) where ...
....
default fixed :: (Generic a, GFixed (Rep a)) => Proxy a -> Int
fixed _ = fixed (Proxy :: Proxy (Rep a b))
我不包括 GFixed U1
的实例,因为拥有实例没有意义void 类型的 Fixed
。我对 Generics
机制的理解不是很好 - 具体来说,M1
和 K1
的类型是什么意思。问题如下:我可以在类型级别限制 GFixed
,以便 fixed
的默认定义不适用于递归类型吗?
例如,如果我写:
data Void
instance Fixed Void
我收到一个类型错误:No instance for (GFixed V1)
。我想得到诸如 instance Fixed [Int]
之类的类型错误。
最佳答案
documentation对构造函数的含义有一定帮助。 M1
指定元信息(例如记录选择器的名称),以及 K1
有点像各种各样的东西*
.如果你想禁止所有递归,你需要确保范围内没有实例匹配 K1 R a
.您仍然需要其他一些 K
范围内的实例,所以你应该改变
instance Fixed a => GFixed (K1 i a) where
到
instance Fixed a => GFixed (K1 P a) where
我不知道是否还有其他值可以作为 K1
的第一个参数, 但如果出现任何情况,添加它们应该是安全的,除了 K1 R
当然。
关于haskell - 使用 GHC.Generics 限制泛型函数域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23118457/
我是一名优秀的程序员,十分优秀!