La traducción directa.
type Vector3D = (Double, Double, Double)
class Shape shape where
name :: shape -> String
position :: shape -> Vector3D
data Sphere = Sphere {
sphereName :: String,
spherePosition :: Vector3D,
sphereRadius :: Double
}
data Prism = Prism {
prismName :: String,
prismPosition :: Vector3D,
prismDimensions :: Vector3D
}
instance Shape Sphere where
name = sphereName
position = spherePosition
instance Shape Prism where
name = prismName
position = prismPosition
Por lo general, no harías esto; es repetitivo y las listas polimórficas requieren extensiones de lenguaje.
En su lugar, pegarlas en un solo tipo de datos cerrado es probablemente la primera solución que debe elegir.
type Vector3D = (Double, Double, Double)
data Shape
= Sphere { name :: String, position :: Vector3D, radius :: Double }
| Prism { name :: String, position :: Vector3D, dimensions :: Vector3D }
Por supuesto que puede simular múltiples niveles de herencia mediante la creación de más clases de tipos:
class (Shape shape) => Prism shape where
dimensions :: Vector3D
data RectangularPrism = ...
data TriangularPrism = ...
instance Prism RectangularPrism where ...
instance Prism TriangularPrism where ...
También puede simular mediante la incorporación de tipos de datos.
type Vector3D = (Double, Double, Double)
data Shape = Shape { name :: String, position :: Vector3D }
data Sphere = Sphere { sphereToShape :: Shape, radius :: Double }
newSphere :: Vector3D -> Double -> Shape
newSphere = Sphere . Shape "Sphere"
data Prism = Prism { prismToShape :: Shape, dimensions :: Vector3D }
data RectangularPrism = RectangularPrism { rectangularPrismToPrism :: Prism }
newRectangularPrism :: Vector3D -> Vector3D -> RectangularPrism
newRectangularPrism = (.) RectangularPrism . Prism . Shape "RectangularPrism"
data TriangularPrism = TriangularPrism { triangularPrismToPrism :: Prism }
newTriangularPrism :: Vector3D -> Vector3D -> TriangularPrism
newTriangularPrism = (.) TriangularPrism . Prism . Shape "TriangularPrism"
Pero simular OO en Haskell no es ni de lejos tan satisfactorio como pensar realmente de una manera Haskellish. ¿Que estás tratando de hacer?
(También tenga en cuenta que todas estas soluciones sólo permiten upcasts, downcasting no es seguro y no permitido.)
¿cómo representarías una cadena de herencia que tiene más de un nivel de profundidad? p.ej. 'shape' ->' Prism' -> 'RectangularPrism' – barkmadley