考虑这个函数:
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
看起来应该可以工作,限定类型系列实例。
关于haskell - 将类型类约束应用于另一个类型类的内部类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22209904/