1

我正在学习 Haskell。想象一下,我有以下内容:

data Coordinate = Coordinate double

我希望为Coordinate.

instance Semigroup (Coordinate a) where
  Coordinate a <> Coordinate b   =  Coordinate (a+b)

类型检查器对我不满意:

    • Expected kind ‘* -> *’, but ‘Coordinate’ has kind ‘*’
    • In the first argument of ‘Semigroup’, namely ‘(Coordinate a)’
      In the instance declaration for ‘Semigroup (Coordinate a)’
    |
175 | instance (Num a) => Semigroup (Coordinate a) where

(我知道这只是一个双倍的空容器,我可能已经在使用双倍本身,但我正在学习 Haskell,我想了解它是如何工作的。)

4

1 回答 1

3

您指定的方式Coordinate,它没有任何类型参数。所以半组实例头应该是简单的

instance Semigroup Coordinate where
  ...

或者,您可以给它一个参数以允许包含不同的数字类型:

newtype Coordinate' a = Coordinate' { getCoordinate' :: a }

在这种情况下,Semigroup实例需要提及参数,但是仅调用它a是不够的,因为您无法+对任意类型执行。您需要将其限制在Double此处

instance Semigroup (Coordinate' Double)

或任意数字类型

instance Num a => Semigroup (Coordinate' a)

请注意,在任何一种情况下,Semigroup可能都不是最好的类,请考虑使用AdditiveGroup,然后您也可以将其设为VectorSpace.

于 2021-11-10T13:39:13.800 回答