考虑这个功能:
f :: Num a0 => [a0] -> Int
f = -- Let's leave open what we actually do here.
我们希望将此功能概括为不仅适用于列表,还适用于Set a
,IntSet a
和其他人。基本上,我们希望为包含Num
个元素的任何MonoTraversable
定义此函数。
问题出在这里:我们需要结合MonoTraversable
约束:
f :: MonoTraversable a1 => a1 -> Int
带有Num
约束的:
f :: Num a0 => [a0] -> Int
但是,MonoTraversable
是一个类型类,因此这不起作用(这是我尝试过的几种变体):
f :: Num a0 => MonoTraversable a0 -> Int
从研究的几小时开始,我想有可能以某种方式使用RankNTypes
(具体来说,是一个2级多态)。
另一次失败的尝试可能会显示我的目标:
f :: Num a0, MonoTraversable a1 => a0 a1 -> Int
但是,即使接近正确,我也找不到任何方法。使用GHC扩展对我来说很好。
答案 0 :(得分:6)
(MonoTraversable a0, Num (Element a0)) => a0 -> Int
看起来应该有效,对类型族实例进行限定。