在Haskell中创建一个Coordinate类

时间:2016-11-26 19:32:49

标签: haskell

我试图以成对的方式将两个多态元组一起添加。 (一个元组中第一个元素的类型应与第二个元素中的第一个元素的类型相同,同样适用于第二个元素) 这是我的代码:

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函数。我想知道是否有人可以提供有关如何实施该功能的任何帮助。 谢谢! :)

2 个答案:

答案 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)

请注意,ab可以是任何类型,但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