我可以根据a的类型类专门化一个可折叠的实例方法吗?

时间:2016-05-04 23:35:35

标签: haskell

我有Foldable个容器aFoldableBasicPrelude类型类提供的方法之一是elem :: (Eq a) => a -> t a -> Bool。现在,对于我的容器,我可以比我的elema实例的默认值更有效地实现Ord,但仅限于此情况。

现在,如果可能的话,我希望提供更高效的elem,最好使用相同的签名(即'透明地')。但是,我只能看到一种方法,即在我的容器的(Ord a)实例上需要Foldable约束,这在一般情况下没有意义。

我是否可以仅针对elema而其他人以某种方式Ord的情况设置专门的elem?如果需要的话,我不介意使用GHC扩展。

1 个答案:

答案 0 :(得分:4)

没有。这是一个长期存在的问题,标准类型类型与需要限制参数的类型不兼容。

但请查看monotraversable library,特别是MonofoldableOrd class,这可能对您有用。 monotraversable库是Foldable / Traversable类的替代版本,已编写用于处理具有单态元素类型的容器(请ByteStringText )或类限制元素类型(想想Set)。

该库是TypeFamilies extension的重度用户,因此您可能需要稍微研究一下 - 尽管库源代码应提供大量有关如何使用扩展的示例。