我正在學習 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
(我知道這只是一個 double 的空容器,我已經可以只使用 double 本身,但我正在學習 Haskell,我想了解它是如何作業的。)
uj5u.com熱心網友回復:
您指定的方式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.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/355726.html
上一篇:判斷一個數能否在一定范圍內整除
