我想创建一个 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,并且[]只有Intom 被索引。例如,该列表不能被Stringami 索引。得到了我想要的:
没错,我必须将键类型分隔符指定为
Show,但我找不到为什么这仍然不好的论据(?)我很乐意接受任何最严厉的批评。