我正在尝试实现康托配对函数,作为
通用 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 接口本身,
但不知道该怎么做。
如果您有权访问类定义,则可以添加Integral
的约束pi
, k
, and l
方法。但这有点令人不满意:没有任何说法Integral
将成为所有实例的正确约束,并且您毕竟不想仅仅因为没有足够的远见而拒绝某些实例。因此,这是一个概括:我们将允许约束在每个实例中有所不同。
{-# LANGUAGE ConstraintKinds, TypeFamilies #-}
import GHC.Exts
newtype CantorPair a = P { unP :: a }
cantorPair :: Integral a => a -> a -> CantorPair a
cantorUnpair :: Integral a => CantorPair a -> (a, a)
cantorPair = undefined
cantorUnpair = undefined
class Pair p where
type Ctxt p a :: Constraint
pi :: Ctxt p a => a -> a -> p a
k :: Ctxt p a => p a -> a
l :: Ctxt p a => p a -> a
instance Pair CantorPair where
type Ctxt CantorPair a = Integral a
pi = cantorPair
k = fst . cantorUnpair
l = snd . cantorUnpair
-- just for fun
data DataPair a = DataPair a a
instance Pair DataPair where
type Ctxt DataPair a = ()
pi = DataPair
k (DataPair a _) = a
l (DataPair _ a) = a
-- this one made GHC panic! neat, I get to file a bug
data Unit a = Unit
instance Pair Unit where
type Ctxt Unit a = a ~ ()
pi _ _ = Unit
k _ = ()
l _ = ()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)