考虑这个功能:
f :: Num a0 => [a0] -> Int f = -- Let's leave open what we actually do here.
我们要推广此功能工作不仅对名单,也对Set a
,IntSet a
等等.基本上,我们希望为MonoTraversable
包含Num
元素的任何元素定义此函数.
问题出在这里:我们需要结合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扩展对我来说很好.
(MonoTraversable a0, Num (Element a0)) => a0 -> Int
看起来它应该工作,限定类型系列实例.