我有Foldable
个容器a
。 Foldable
中BasicPrelude
类型类提供的方法之一是elem :: (Eq a) => a -> t a -> Bool
。现在,对于我的容器,我可以比我的elem
是a
实例的默认值更有效地实现Ord
,但仅限于此情况。
现在,如果可能的话,我希望提供更高效的elem
,最好使用相同的签名(即'透明地')。但是,我只能看到一种方法,即在我的容器的(Ord a)
实例上需要Foldable
约束,这在一般情况下没有意义。
我是否可以仅针对elem
为a
而其他人以某种方式Ord
的情况设置专门的elem
?如果需要的话,我不介意使用GHC扩展。
答案 0 :(得分:4)
没有。这是一个长期存在的问题,标准类型类型与需要限制参数的类型不兼容。
但请查看monotraversable
library,特别是MonofoldableOrd
class,这可能对您有用。 monotraversable
库是Foldable
/ Traversable
类的替代版本,已编写用于处理具有单态元素类型的容器(请ByteString
或Text
)或类限制元素类型(想想Set
)。
该库是TypeFamilies
extension的重度用户,因此您可能需要稍微研究一下 - 尽管库源代码应提供大量有关如何使用扩展的示例。