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扩展对我来说很好.