如何在函数式编程中建模继承关系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在函数式编程中建模继承关系相关的知识,希望对你有一定的参考价值。

面向对象的编程范例使用继承来建模遵循泛化 - 专业化关系的实体之间的关系。这里,Base类用于封装一组实体的公共(常规)属性和行为,Derived Classes通过添加其他属性和/或添加/修改现有行为来扩展基类。

作为功​​能编程的新手,我需要在F#等函数语言中建模这种关系的指导。

例如什么是建模简单情况的最佳方法,如下所示:

abstract class Tutorial { 
  private String topic;
  abstract public void learn();
}

class VideoTutorial extends Tutorial {
  private float duration;
  public void learn () {
    System.out.println ("read PDF");
  }
}

class PDFTutorial extends Tutorial {
  private int pageCount;
  public void learn () {
    System.out.println ("Watch Video");
  }
}

然后使用教程集合并调用学习观察多态行为。

答案

在功能设计中,你会对事物有所不同,因此这些想法​​不会完美映射。通常,功能设计更侧重于表达您正在使用的实体的数据类型。在你的情况下,你可以使用一个有区别的联合定义TutorialKind,它是视频或PDF,然后Tutorial将成为一种类型及其主题的记录:

type TutorialKind = 
  | VideoTutorial of duration:float
  | PDFTutorial of pageCount:int

type Tutorial = 
  { Kind : TutorialKind
    Topic : string }

请注意,这只保留了有关教程的数据。任何功能都可以在与教程类型匹配的函数中实现:

let learn tutorial = 
  match tutorial.Kind with
  | VideoTutorial _ -> printfn "Watch video"
  | PDFTutorial _ -> printfn "Read PDF"

请注意,这可以在与OO版本不同的方向上进行扩展。在OO中,您可以轻松添加新的子类;在这里,您可以轻松添加新功能。在实践中,功能人员通常对此更改感到满意,但F#是一种混合语言,如果您需要“OO风格的可扩展性”,则可以轻松使用界面。

以上是关于如何在函数式编程中建模继承关系的主要内容,如果未能解决你的问题,请参考以下文章

建模语言的概念 与编程语言概念相应关系(入门必读)

如何在关系数据库中进行继承建模?

函数式编程第一弹

MapReduce分布编程模型之函数式编程范式

大数据之MapReduce分布编程模型之函数式编程范式

类型流(TypeFlow)——世俗化的函数式编程和改进的过程式设计