将类型类约束应用于另一个类型类的内部类型

时间:2014-03-05 21:38:57

标签: haskell types type-constraints

考虑这个功能:

f :: Num a0 => [a0] -> Int
f = -- Let's leave open what we actually do here.

我们希望将此功能概括为不仅适用于列表,还适用于Set aIntSet 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扩展对我来说很好。

1 个答案:

答案 0 :(得分:6)

(MonoTraversable a0, Num (Element a0)) => a0 -> Int看起来应该有效,对类型族实例进行限定。