我正在尝试以成对的方式将两个多态元素添加在一起。(一个元组中的第一个元素的类型应与第二个元素中的第一个类型相同,而第二个元素也应与第二个元素相同)这是我的代码:
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)
因此,问题在于我的附加组件功能。我想知道是否有人可以为我提供任何帮助如何实施该功能。谢谢!:)
您可能想要数据类型,而不是类:
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
我觉得这可能是我想要的解决方案
module Main where
class Coordinate c where
createCoordinate :: x -> y -> c x y
getFirst :: c x y -> x
getSecond :: c x y -> y
addCoordinates :: (Num x) => (Num y) => c x y -> c x y -> c x y
instance Coordinate (,) where
createCoordinate a b = (a,b)
getFirst (a,_) = a
getSecond (_,b) = b
addCoordinates a b = (getFirst a + getFirst b, getSecond a + getSecond b)