gpt4 book ai didi

scala - F# 和 Scala 中的 ADT

转载 作者:行者123 更新时间:2023-12-04 15:53:29 27 4
gpt4 key购买 nike

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the help center寻求指导。




9年前关闭。




F# 和 Scala 中的 ADT 之间的主要区别是什么?有什么 F# 的 ADT 可以做而 Scala 的 ADT 不能(反之亦然)吗?

最佳答案

从概念上讲,我认为这两种语言都提供了相同的功能——在 F# 中,您可以使用可区分联合声明 ADT,而在 Scala 中,您可以使用案例类。 Scala 中使用类的声明可能比 F# 版本长一点(正如殷朱指出的那样),但是您可以在两种语言中使用具有相似优雅的模式匹配。

这是一个简化术语的示例(from this article):

def simplify(term: Term) = term match {
case Mul(Num(0), x) => Num(0)
case Mul(Num(1), x) => x
case _ => term
}

F# 中使用 match 的相同代码看起来非常相似:
let simplify term = 
match term with
| Mul(Num(0), x) -> Num(0)
| Mul(Num(1), x) -> x
| _ -> term

差异 我认为在更高级(相关)功能方面存在一些差异。
  • 在 Scala 中,每个 case 也是一种类型,因此您可以定义一个方法,例如使用 NumMul作为论据。在 F# 中,这是不可能的,因为 NumMul只是 Term 类型的构造函数.我想这有时可能很有用,但大多数时候,您将使用类型为 Term 的值。反正。
  • 与前一点相关 - 在 Scala 中,您还可以为个别情况定义方法。例如,您可以在 Num 中定义一个方法。类(class)。在 F# 中,所有成员都必须是 Term 的成员。类型。
  • 在 F# 中,您可以使用事件模式来隐藏类型的内部表示(例如,从模块中导出它时)。这对于库设计非常有用。例如,您可以定义事件模式:
    val (|Mul|_|) // return Some(..) if Term represents multiplication
    val (|Num|_|) // return Some(..) if Term represents number

    内部表示可以随时间变化而不会影响库接口(interface),因此您可以例如实现这样的接口(interface):
    type Term = Binary of string * Term * Term | Num of int
    let (|Num|_|) = function Num n -> Some n | _ -> None
    let (|Mul|_|) = function Binary("*", a, b) -> Some(a, b) | _ -> None
  • 关于scala - F# 和 Scala 中的 ADT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2894799/

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