oop – 在Haskell中扩展数据结构的继承

一个C程序员试图在这里学习Haskell。请原谅这个很容易的问题。我想翻译一个代表3D形状的程序。在C我有一些像:

class Shape {
public:
  std::string name;
  Vector3d position;
};

class Sphere : public Shape {
public:
  float radius;
};

class Prism : public Shape {
public:
  float width, height, depth;
};

我正在尝试将其转换为Haskell(使用记录?),以便我可以使用一些功能来了解如何在Shape上操作(如访问其名称和位置),而不知道如何操作球体,例如计算基于它的位置和半径的东西。

在C中,一个成员函数只能访问这些参数,但是我很难弄清楚如何在Haskell中使用记录,或键入类或其他方法。

谢谢。

与阻止使用类型学的趋势相反,我建议(正如你正在学习)探索一种没有类型和不同类型的解决方案,以获得各种方法的不同权衡的感觉。

“单封闭数据类型”解决方案当然比类型类更“功能”。这意味着您的形状列表由您的形状模块“固定”,并且不能从外部扩展新的形状。在形状上添加新功能仍然很容易。

如果您具有仅在单个形状类型上运行的功能,那么您将略有不便,因为您放弃静态编译器检查传入的形状对于该函数是否正确(请参阅Nathan的示例)。如果您有很多这些部分功能只能在数据类型的一个构造函数上工作,我将重新考虑该方法。

对于类型解决方案,我个人不喜欢镜像形状类层次结构,而是创建“具有表面区域的东西”,“具有卷的东西”,“具有半径的东西”的类型类…

这样就可以编写具有特殊形状的功能,例如球体(每个形状都是它自己的类型),但不能写入任何“任何形状”的功能,然后区分各种具体的形状。

http://stackoverflow.com/questions/1677621/inheritance-to-extend-a-data-structure-in-haskell

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:oop – 在Haskell中扩展数据结构的继承