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

Uli*_*ler 2 haskell types type-constraints

考虑这个功能:

f :: Num a0 => [a0] -> Int
f = -- Let's leave open what we actually do here.
Run Code Online (Sandbox Code Playgroud)

我们要推广此功能工作不仅对名单,也对Set a,IntSet a等等.基本上,我们希望为MonoTraversable包含Num元素的任何元素定义此函数.

问题出在这里:我们需要结合MonoTraversable约束:

f :: MonoTraversable a1 => a1 -> Int
Run Code Online (Sandbox Code Playgroud)

Num约束:

f :: Num a0 => [a0] -> Int
Run Code Online (Sandbox Code Playgroud)

但是,MonoTraversable是一个类型类,因此这不起作用(这是我试过的几种变体):

f :: Num a0 => MonoTraversable a0 -> Int
Run Code Online (Sandbox Code Playgroud)

从研究的几个小时开始,我想有可能以某种方式使用RankNTypes(特别是2级多态)用于此目的.

另一个失败的尝试可能会显示我的目标:

f :: Num a0, MonoTraversable a1 => a0 a1 -> Int
Run Code Online (Sandbox Code Playgroud)

但是,我只是找不到任何方法,即使接近正确也是如此.使用GHC扩展对我来说很好.

Lou*_*man 6

(MonoTraversable a0, Num (Element a0)) => a0 -> Int 看起来它应该工作,限定类型系列实例.