gpt4 book ai didi

Haskell 构造函数别名

转载 作者:行者123 更新时间:2023-12-04 16:23:18 27 4
gpt4 key购买 nike

有没有办法在 Haskell 中创建相当于创建“构造函数别名”的东西?我在想类似于类型别名,你可以给类型一个不同的名字,但它仍然在各个方面表现得像别名类型。

我的用例是一个系统,我有一个分配的时间作为我正在建模的某些对象的属性,所以 UTCTime .其中一些可能是“可变”时间,这意味着它可能尚未分配时间,或者它所拥有的时间是“可移动的”。所以Maybe UTCTime .

但只有一些对象具有可变时间。其他人则有固定的时间,系统必须将其视为常数;当前分配给特定时间的时间变量的处理方式与固定时间不同。现在建议 Either UTCTime (Maybe UTCTime) ;它是固定时间或可能未分配的可变时间。

泛型类型似乎非常适合我想要建模的内容,因此使用它们感觉很自然。但是,虽然很明显 Either UTCTime (Maybe UTCTime)也就是说,它的含义并不是特别明显,所以一些描述性的特殊情况名称会很好。

一个简单的type Timeslot = Either UTCTime (Maybe UTCTime)肯定会清理我的类型签名很多,但这对构造函数没有任何作用。我可以使用 bound = Just 之类的东西获取用于构造值的名称,但不用于模式匹配。

在另一端,我可以用我想要的任何名称定义一个自定义 ADT,但是我失去了 Either 的所有预定义功能。和 Maybe类型。或者更确切地说,我将一直来回应用转换(我认为这并不比使用 newtype 包装器的情况更糟糕,只是没有效率保证,但我怀疑这无论如何都会成为瓶颈)。我想使用通用 Either 来理解代码和 Maybe操纵我的Timeslot的函数我需要知道标准构造函数映射到我想要使用的任何东西的方式,并且转换函数将提供该映射的方便的编译器强制定义。所以也许这毕竟是一个好方法。

我很确定我非常了解 Haskell,可以说没有构造函数别名之类的东西,但我很好奇是否有一些我不知道的 hack,或者其他处理这种情况的好方法。

最佳答案

尽管您提到了这些缺点,但我强烈建议您为您的类型创建一个新的 ADT;例如

data TimeVariable = Constant UTCTime | Assigned UTCTime | Unassigned

我提出以下论点:
  • 拥有描述性构造函数将使您的代码——包括构造和模式匹配——明显更具可读性。比较 UnassignedRight Nothing .现在加上六个月并做同样的比较。
  • 我怀疑随着你的应用程序的增长,你会发现这种类型需要扩展。使用自定义 ADT 将另一个构造函数或另一个字段添加到现有构造函数要容易得多,并且可以很容易地识别需要更新以处理新类型的代码位置。
  • 这种类型的合理操作可能不会像标准库中用于处理 Either 的操作那么多。和 Maybe值(value)观——所以我敢打赌,你复制的代码不会像你想象的那样多。尽管你可能会重复一些代码,但给你的函数提供描述性名称是有值(value)的,因为它具有与给你的构造函数提供描述性名称相同的可读性和重构原因。
  • 我亲自编写了一些代码,其中我所有的总和都是 Either我所有的产品都是(,) .那太差了。我永远记不得金额的哪一边代表什么。在阅读旧代码时,我必须不断提醒自己每个值应该是什么概念类型(例如 Right 并没有告诉你这里是使用 Right 作为时间变量的一部分还是其他东西的一部分你懒得做ADT);我不得不不断地在精神上扩展类型别名;等等。从我的痛苦中学习。 ;-)
  • 关于Haskell 构造函数别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19072930/

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