gpt4 book ai didi

haskell - 另一种新类型与数据(风格问题)

转载 作者:行者123 更新时间:2023-12-01 23:39:54 25 4
gpt4 key购买 nike

我非常了解datanewtypetype之间的区别。我正在编写一个小脚本,它将构建某种语法树。 几乎所有类型都有一个构造函数。我避免使用 type 来加强安全性(多个“不同”类型最终可能在 Haskell 中具有相同的类型)。在这种情况下,我不关心惰性/严格性,也不关心性能(这部分绝不是性能关键)。我主要关注风格。我有三个选择:

  1. 仅使用数据。这感觉还不错,只是我有很多类型,只有一个带有一个参数的构造函数。代码看起来有些浪费……虽然我不关心性能增益,但感觉不太对劲。
  2. 仅使用newtype。在多个参数的情况下,这会导致元组出现很多丑陋的情况。
  3. 混合datanewtype,这看起来有点不统一,而且有点烦人。我宁愿以单一一致的方式声明所有类型。

我在1和3之间进退两难。

最佳答案

在这种情况下,出于几个原因,我会普遍使用data。首先,为了与多参数情况保持一致(肯定应该是data,而不是newtype)。

其次,也是最重要的一点,newtypedata 具有不同的语义! newtype 的构造函数是严格的,而 data 的构造函数是非严格的,除非您显式使用严格字段。即使您不关心严格性,或者您的data的所有字段都是严格的,仍然有一些subtle differences .

我不认为单构造函数、单参数 data 类型是浪费——从语法上讲,它们就像 newtype 一样轻,而且从语义上看,似乎对我来说更重要。

您说过您不关心性能,但是如果数据的运行时装箱开销确实不方便,那么您可以混合它们,只要您了解语义差异。但是,如果您使用 -funbox-strict-fields ,那么 GHC 可能能够为您优化单构造函数、单参数数据(如果它们发生)作为其他数据类型中的严格字段。

通常,在包装现有类型时,出于编译时安全/抽象的目的,或者定义自己的实例,您应该使用 newtype ,并使用 data 每当类型恰好由单个字段组成,而不是包装器时。

关于haskell - 另一种新类型与数据(风格问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9293882/

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