我试图以成对的方式将两个多态元组一起添加。 (一个元组中第一个元素的类型应与第二个元素中的第一个元素的类型相同,同样适用于第二个元素) 这是我的代码:
module Main where
class Coordinate a where
createCoordinate :: a
getFirst :: (a,b) -> a
getSecond :: (a,b) -> b
addCoordinates :: (a,b) -> (a,b) -> (a,b)
instance Coordinate () where
createCoordinate = ()
getFirst (a,b) = a
getSecond (a,b) = b
addCoordinates a b = (getFirst a + getFirst b, getSecond a + getSecond b)
所以,问题在于我的addCoordinates函数。我想知道是否有人可以提供有关如何实施该功能的任何帮助。 谢谢! :)
答案 0 :(得分:4)
您可能需要数据类型,而不是类:
data Coordinate a b = Coordinate { getFirst :: a, getSecond :: b }
deriving (Eq, Ord, Show)
您的功能将变为:
createCoordinate :: a -> b -> Coordinate a b
createCoordinate a b = Coordinate a b
addCoordinates :: (Num a, Num b) => Coordinate a b -> Coordinate a b -> Coordinate a b
addCoordinates (Coordinate a1 b1) (Coordinate a2 b2) = Coordinate (a1+a2) (b1+b2)
请注意,a
和b
可以是任何类型,但addCoordinates
仅在Num
的实例有效时才有效,因为我们希望应用+
} 给他们。您不需要类型类来定义Coordinate
。
类型类允许您定义可以初始化为默认值的内容,例如:
class DefaultInitializable a where
defaultInit :: a
然后我们可以使Int
成为这个类的一个实例:
instance DefaultInitializable Int where
defaultInit = 0
只要其参数也是实例,我们就可以使Coordinate
成为实例:
instance (DefaultInitializable a, DefaultInitializable b) => DefaultInitializable (Coordinate a b) where
defaultInit = Coordinate default default
答案 1 :(得分:0)
我觉得这可能是我想要的解决方案
rapidjson::Document