Haskell 中的实例和 class
Instances and class in Haskell
我在Haskell中有以下代码:
module Shape where
type Height = Float
type Width = Float
type Radius = Float
data Rectangle = Rectangle Height Width
data Circle = Circle Radius
class (Eq a, Show a) => Shape a where
area :: a -> Float
perimeter :: a -> Float
instance Shape Rectangle where
area (Rectangle h w) = h * w
perimeter (Rectangle h w) = h*2 + w*2
show (Rectangle h w) = "rectangle " ++ (show h) ++ " " ++ (show w)
(==) (Rectangle h w) (Rectangle c d) = (h == c) && (w == d)
instance Shape Circle where
area (Circle r) = pi * r**2
perimeter (Circle r) = 2 * pi * r
show (Circle r) = "circle " ++ (show r)
(==) (Circle r) (Circle x) = r == x
并且我想添加 Show 和 Eq 的实例以定义新的案例(例如 Rectangle * * == Rectangle * *)但是我遇到了以下问题:
[1 of 1] Compiling Shape ( Shape.hs, interpreted )
Shape.hs:24:17: `show' is not a (visible) method of class `Shape'
Shape.hs:25:17: `==' is not a (visible) method of class `Shape'
Shape.hs:31:12: `show' is not a (visible) method of class `Shape'
Shape.hs:32:12: `==' is not a (visible) method of class `Shape'
Failed, modules loaded: none.
这是什么意思?我怎样才能让它发挥作用?
编辑:
现在的代码:
(第 13 至 31 行)
instance Eq Rectangle where
(Rectangle h w) == (Rectangle c d) = (h == c) && (w == d)
instance Show Rectangle where
show (Rectangle h w) = "rectangle " ++ (show h) ++ " " ++ (show w)
instance Shape Rectangle where
area (Rectangle h w) = h * w
perimeter (Rectangle h w) = h*2 + w*2
instance Eq Circle where
(Circle r) == (Circle x) = r == x
instance Show Circle where
show (Circle r) = "circle " ++ (show r)
instance Shape Circle where
area (Circle r) = pi * r**2
perimeter (Circle r) = 2 * pi * r
错误:
[1 of 1] Compiling Shape ( Shape.hs, interpreted )
Shape.hs:19:5: parse error on input `instance'
Failed, modules loaded: none.
为每种类型和它所属的每个类型类拆分实例。
instance Eq Rectangle where
(==) (Rectangle h w) (Rectangle c d) = (h == c) && (w == d)
instance Show Rectangle where
show (Rectangle h w) = "rectangle " ++ (show h) ++ " " ++ (show w)
instance Shape Rectangle where
area (Rectangle h w) = h * w
perimeter (Rectangle h w) = h*2 + w*2
只是每个类型的 show
和 ==
定义不是 Shape
实例的一部分,它们是 Show
的类型类实例的一部分和 Eq
恰好是 Shape
.
的依赖项
我在Haskell中有以下代码:
module Shape where
type Height = Float
type Width = Float
type Radius = Float
data Rectangle = Rectangle Height Width
data Circle = Circle Radius
class (Eq a, Show a) => Shape a where
area :: a -> Float
perimeter :: a -> Float
instance Shape Rectangle where
area (Rectangle h w) = h * w
perimeter (Rectangle h w) = h*2 + w*2
show (Rectangle h w) = "rectangle " ++ (show h) ++ " " ++ (show w)
(==) (Rectangle h w) (Rectangle c d) = (h == c) && (w == d)
instance Shape Circle where
area (Circle r) = pi * r**2
perimeter (Circle r) = 2 * pi * r
show (Circle r) = "circle " ++ (show r)
(==) (Circle r) (Circle x) = r == x
并且我想添加 Show 和 Eq 的实例以定义新的案例(例如 Rectangle * * == Rectangle * *)但是我遇到了以下问题:
[1 of 1] Compiling Shape ( Shape.hs, interpreted )
Shape.hs:24:17: `show' is not a (visible) method of class `Shape'
Shape.hs:25:17: `==' is not a (visible) method of class `Shape'
Shape.hs:31:12: `show' is not a (visible) method of class `Shape'
Shape.hs:32:12: `==' is not a (visible) method of class `Shape'
Failed, modules loaded: none.
这是什么意思?我怎样才能让它发挥作用?
编辑: 现在的代码: (第 13 至 31 行)
instance Eq Rectangle where
(Rectangle h w) == (Rectangle c d) = (h == c) && (w == d)
instance Show Rectangle where
show (Rectangle h w) = "rectangle " ++ (show h) ++ " " ++ (show w)
instance Shape Rectangle where
area (Rectangle h w) = h * w
perimeter (Rectangle h w) = h*2 + w*2
instance Eq Circle where
(Circle r) == (Circle x) = r == x
instance Show Circle where
show (Circle r) = "circle " ++ (show r)
instance Shape Circle where
area (Circle r) = pi * r**2
perimeter (Circle r) = 2 * pi * r
错误:
[1 of 1] Compiling Shape ( Shape.hs, interpreted )
Shape.hs:19:5: parse error on input `instance'
Failed, modules loaded: none.
为每种类型和它所属的每个类型类拆分实例。
instance Eq Rectangle where
(==) (Rectangle h w) (Rectangle c d) = (h == c) && (w == d)
instance Show Rectangle where
show (Rectangle h w) = "rectangle " ++ (show h) ++ " " ++ (show w)
instance Shape Rectangle where
area (Rectangle h w) = h * w
perimeter (Rectangle h w) = h*2 + w*2
只是每个类型的 show
和 ==
定义不是 Shape
实例的一部分,它们是 Show
的类型类实例的一部分和 Eq
恰好是 Shape
.