如何继承数据构造函数中的字段



我是Haskell的新手,希望在Haskell中实现这段C#代码。我想继承字段"title",或者让它成为所有产品所必需的,但我创建的所有示例都是关于函数而不是字段的。

public abstract class Product
{
public string title;
public string getTitle()
{
return title;
}
}
public class Videotape : Product
{
}
public class Book : Product
{
public string authorName;
}

Haskell不是一种面向对象的语言,因此继承的概念并不直接存在。类似的事情有很多方法,选择合适的方法需要更多的背景。

一种方法如下。

您可以将示例中的继承看作实现了两件事:

  • Product的所有子类都包含一个字段title

  • Product的所有子类都支持返回字符串的方法getTitle

如果我们把这两件事都看作是分开的,那么下面的解决方案就说明了这一点。

首先,产品数据类型:

data Product = Product { title :: String }

这将创建一个数据类型Product,其中包含一个构造函数,也称为Product,包含一个类型为String字段(称为title)。CCD_ 10是作为类型CCD_。

现在,让我们为Product创建一个类型类,描述getTitle方法。类型类与C#/OOP中的类不是一回事,而是更类似于接口的概念。

class Product' a where
getTitle :: a -> String

该类型类声明了一个方法getTitle,该方法采用a,其中aProduct'实例,并返回一个String。

接下来,我们将为Product'定义一个Product'的实例。

instance Product' Product where
getTitle = title

这将Product定义为Product'的实例。这使sit能够取代预期Product'实例的a。这意味着getTitle可以在Product上调用,所以我们必须定义它应该做什么。在这种情况下,getTitle应该简单地做与title相同的事情,即返回title字段。

现在让我们定义";子类":

data Videotape = Videotape { vtProduct :: Product }
data Book = Book { bProduct :: Product, authorName :: String }

我们创建了两种数据类型。CCD_ 29只包含一个类型为CCD_。Book还添加了自己的字段authorName。(Product字段必须具有唯一的名称。Haskell将每个字段转换为一个函数,并且在同一模块中不能有两个同名的函数)。

现在让我们定义这些类型的实例:

instance Product' Videotape where
getTitle vt = getTitle (vtProduct vt)
instance Product' Book where
getTitle b = getTitle (bProduct b)

现在,您可以对任何一种类型的对象调用getTitle,并获得与其标题相对应的String

我相信这里有很多你不熟悉的术语和概念,但如果你读过它们,你可能会理解Haskell是如何以不同的方式做很多事情的,并拓宽你设计和编写软件的方法。

你可能会发现这些资源很有用:

Haskell Wiki 中OOP与类型类的比较
  • Haskell支持面向对象编程吗?SO

  • 哈斯克林快乐!

    相关内容

    • 没有找到相关文章

    最新更新