我尝试实现Cantor Pairing函数,作为一个泛型Pair类型类的示例,如下所示:
module Pair (Pair, CantorPair) where
-- Pair interface
class Pair p where
pi :: a -> a -> p a
k :: p a -> a
l :: p a -> a
-- Wrapper for typing
newtype CantorPair a = P { unP :: a }
-- Assume two functions with signatures:
cantorPair :: Integral a => a -> a -> CantorPair a
cantorUnpair :: Integral a => CantorPair a -> (a, a)
-- I need to somehow add an Integral a constraint to this instance,
-- but I can't work out how to do it.
instance Pair CantorPair where
pi = cantorPair
k = fst . cantorUnpair
l = snd . cantorUnpair
我如何添加适当的积分约束到示例中?我有一种模糊的感觉,我可能需要修改Pair接口本身,但不知道如何去做。
3条答案
按热度按时间sgtfey8w1#
如果您可以访问类定义,则可以为
pi
、k
和l
方法添加一个Integral
约束。没有什么可以说Integral
是所有示例的正确约束,毕竟您不想仅仅因为没有足够的远见就拒绝某些示例。我们将允许约束在每个示例中变化。jmp7cifd2#
是否希望所有的对都包含整数元素?在这种情况下,可以将约束添加到方法的签名中:
这将使你的pair类不那么通用,但将确保你的
CantorPair
类型可以是它的一部分。如果你想让你的
Pair
类保持一定的通用性,你可以使用一个多参数类型类。(这需要两个扩展:MultiParamTypeClasses
和FlexibleInstances
)。我不知道从设计的Angular 来看,这是否是最好的选择,但这是了解多参数类型类如何工作的好方法。(不可否认,这相当简单。)
72qzrwbm3#
这个解决方案使用type families,所以你需要
-XTypeFamilies
。我们将类型约束放在类型本身上,而不是类型构造函数上:然后我们创建如下示例: