gpt4 book ai didi

haskell - 使用 GHC.Generics 限制泛型函数域

转载 作者:行者123 更新时间:2023-12-02 03:36:34 28 4
gpt4 key购买 nike

假设我有一个类型类:

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 机制的理解不是很好 - 具体来说,M1K1 的类型是什么意思。问题如下:我可以在类型级别限制 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com