gpt4 book ai didi

scala - "Composite"Scala 和 Haskell 中的代数数据类型

转载 作者:行者123 更新时间:2023-12-04 13:24:00 25 4
gpt4 key购买 nike

在尝试用 Scala 中的代数数据类型描述 Sql 的一部分时,我遇到了创建表示数据类型的根特征的子特征的必要性。由于满足此要求产生了一个我不确定是否可以用 Haskell 的 ADT 表示的代码,并且由于与 Haskell 不同,ADT 不是 Scala 的 native 构造,我现在想知道:

  • 我说得对吗,无法表示类型 Sql 之类的模型?有一个“子类型”Statement有一个构造函数Select在 haskell ? (似乎 this 可能相关)。
  • 如果是这样,术语“ADT”是否适用于我生成的代码?
  • 如果是的话,这是否使 Scala 在这方面实际上比 Haskell 更强大?
  • 如果没有,这个功能没有在 Haskell 中实现的原因是什么?这让我觉得我的模型可能过于复杂了

  • 这是我正在谈论的模型:
    sealed trait Sql


    sealed trait Statement
    extends Sql

    sealed case class Union
    ( left : Statement,
    right : Statement )
    extends Statement

    sealed case class Select
    ( /** other fields don't matter **/
    where : Where )
    extends Statement


    sealed trait Where
    extends Sql

    sealed case class And
    ( left : Where,
    right : Where )
    extends Where

    sealed case class Or
    ( left : Where,
    right : Where )
    extends Where

    sealed case class Equals
    ( /** fields don't matter **/ )
    extends Where

    最佳答案

    1. 不,因为你的根特性是密封的,它 可以将呈现的层次结构表示为 ADT:

    data Sql = Statement Statement | Where Where
    -- ^ This is the *type* called `Statement`
    -- ^ This is the *constructor* called `Statement`

    data Statement = Union Statement Statement | Select Where

    data Where = And Where Where | Or Where Where | Equals

    在这种情况下是可能的,因为您可以枚举您的数据类型的所有“子类”(在这种情况下为 Sql),这使得将它们转换为 ADT 构造函数成为可能。如果您想允许用户任意添加“构造函数”/“子类”,那么将类型层次结构模拟为 ADT 是很困难的。

    2. 术语 ADT 永远不适用于 Scala 代码,因为 Scala 在语言中缺少 ADT。但是,您提供的类的行为类似于 ADT,所以我会说“足够接近”。

    3 & 4。这些语言有不同的优点和缺点。

    Haskell 可以模拟每个 Scala 语言功能,Scala 可以模拟每个 Haskell 功能,因为这两种语言都是图灵完备的,并且允许不同级别的元编程。 Haskell 当然有 Template Haskell,它允许模拟任何东西——您可能使用 TH 能够在 Haskell 文件中编写 Scala 代码并将其编译为 Haskell。

    Haskell 中不需要对象和继承,Scala 中大多不需要 ADT,因此没有理由将两者进行比较。大多数面向对象的特性也可以用简单的 Haskell 类型类和数据类型以及使用模块边界来模拟。 ADT 可以在 Scala 中用案例类来模拟,而 Haskell 类型的类可以用隐式参数和隐式对象实例来模拟。

    但是,我想说的是,在 Haskell 中模拟某些 Scala 功能通常更容易,因为 Haskell 允许比 Scala 更多的“隐式语言扩展”。我的意思是,如果你想模仿 Haskell Monad在 Scala 中,您必须在使用 Monad 的部分中编写大量代码s,如果你想模拟,比如说,Scala 的定界延续或 Haskell 中的隐式参数,你可以简单地写一个 Monad实例(用于延续)或多参数类型类(用于隐式参数)一次,您稍后在实际函数中编写的代码将看起来非常接近 Scala 代码而没有太多样板。 Scala 的许多高级功能(如果不是大部分的话)也确实源自 Haskell 或 OCaml,因此它们已经存在并且不需要翻译。

    换句话说:添加新功能所需的复杂代码只需在 Haskell 中的一个位置添加,之后它可以很容易地在多个位置使用,而您通常必须在您的任何地方添加大量“噪音”如果您想模拟 Haskell 功能,请使用 Scala 代码。

    关于scala - "Composite"Scala 和 Haskell 中的代数数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12055236/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com