我想创建一个 Container 类,以便不仅用作函数中的参数,例如具有整数键的列表,而且还可以包含任何可以包含值并通过任何比较 ( Eq
) 键明确搜索它们的类型.
class Container c where
at :: (Eq k) => c -> k -> v
当我尝试为同一个列表创建一个类实例时,困难立即开始了(代码不起作用):
{-
instance Container [a] where
at lst k = lst !! k
-}
输出以下错误消息:
• Couldn't match expected type ‘Int’ with actual type ‘k’ ‘k’ is a rigid type variable bound by the type signature for: at :: forall k v. Eq k => [a] -> k -> v
也就是说,他们说,关键是不够Eq
,但显然必须Int
按照要求!!
。逻辑上,当然!但是,尽管如此,我怎样才能摆脱并实施我的想法呢?
PS 在标准语言的框架内是可取的,没有扩展。
PPS 也需要批评一下问题作者自己给出的答案⬎
这里的问题是
[]
它不能是您的类的实例。根据定义,您的类的实例应该由任何带有 的索引Eq
,并且[]
只有Int
om 被索引。例如,该列表不能被String
ami 索引。得到了我想要的:
没错,我必须将键类型分隔符指定为
Show
,但我找不到为什么这仍然不好的论据(?)我很乐意接受任何最严厉的批评。