有没有办法在 Haskell 中创建相当于创建“构造函数别名”的东西?我在想类似于类型别名,你可以给类型一个不同的名字,但它仍然在各个方面表现得像别名类型。
我的用例是一个系统,我有一个分配的时间作为我正在建模的某些对象的属性,所以UTCTime
. 其中一些可能是“可变”时间,这意味着它可能尚未分配时间,或者它所拥有的时间是“可移动的”。所以Maybe UTCTime
。
但只有一些对象具有可变时间。其他人则有固定的时间,系统必须将其视为常数;当前分配给特定时间的时间变量的处理方式与固定时间不同。现在建议Either UTCTime (Maybe UTCTime)
; 它是固定时间或可能未分配的可变时间。
泛型类型似乎非常适合我想要建模的内容,因此使用它们感觉很自然。但是,虽然什么Either UTCTime (Maybe UTCTime)
是显而易见的,但它的含义并不是特别明显,所以一些描述性的特殊情况名称会很好。
一个简单的type Timeslot = Either UTCTime (Maybe UTCTime)
肯定会清理我的类型签名很多,但这对构造函数没有任何作用。我可以使用类似bound = Just
获取名称来构造值,但不能用于模式匹配。
在另一端,我可以使用我想要的任何名称定义一个自定义 ADT,但是我失去了Either
andMaybe
类型的所有预定义功能。或者更确切地说,我将一直来回应用转换(我认为这并不比使用newtype
包装器的情况更糟,只是没有效率保证,但我怀疑这无论如何都会成为瓶颈)。而且我想理解使用泛型Either
和Maybe
函数来操作我的Timeslot
值的代码我需要知道标准构造函数映射到我想要使用的任何东西的方式,并且转换函数将提供一个方便的编译器强制定义该映射. 所以也许这毕竟是一个好方法。
我很确定我非常了解 Haskell,可以说没有构造函数别名之类的东西,但我很好奇是否有一些我不知道的 hack,或者其他处理这种情况的好方法。