Consider this function:
f :: Num a0 => [a0] -> Int
f = -- Let's leave open what we actually do here.
We want to generalize this function to work not only on lists, but also on Set a
, IntSet a
and others. Basically, we want this function to be defined for any MonoTraversable
that contains Num
elements in it.
Here comes the problem: We need to combine the MonoTraversable
constraint:
f :: MonoTraversable a1 => a1 -> Int
with the Num
constraint:
f :: Num a0 => [a0] -> Int
However, MonoTraversable
is a typeclass, therefore this can't work (several variants of this is what I tried):
f :: Num a0 => MonoTraversable a0 -> Int
From hours of researching I guess it's possible to somehow use RankNTypes
(specifically, a rank 2 polymorphism) for this purpose.
Another failed attempt that might display what I'm aiming for:
f :: Num a0, MonoTraversable a1 => a0 a1 -> Int
However, I just can't find any way how to do it even close to properly. Using GHC extensions is fine for me.
(MonoTraversable a0, Num (Element a0)) => a0 -> Int
看起来应该可以工作,可以对类型族实例进行限定。
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.