【发布时间】:2021-10-28 02:49:51
【问题描述】:
您好,到目前为止,我只使用过命令式编程,并且正在学习 Haskell :)
我有以下代数数据类型:
data Day = I | ... | XXXI deriving(Ord,Eq) (Days in roman numerals)
data Month = Jan | ... | Dec deriving(Ord,Eq) (Months abbreviated to 3 letters)
data Year = 0 | ... | 2021 (actually Ints)
我需要对这些进行一些计算。我的第一个想法是将日期和月份映射到整数并从那里进行计算。例如:
dayConversionMap = [(I,1), (II,2), (III,3), (IV,4), ... , (XXXI,31)]
monthConversionMap = [(Jan,1), (Feb,2), (Mar,3), ... , (Dec,12)]
我的问题是:
- 这是解决我的问题的好方法吗?
- 如果我有这些地图,我如何在函数中将天/月转换为整数。
提前致谢! :)
【问题讨论】:
-
您能否说明您希望进行哪些计算?例如,如果您希望能够将一个月“加 1”(例如,从一月到二月),您可以推导出
Enum(假设您按顺序排列月份,因为它定义了基于此的枚举) 并使用succ。但这可能很脆弱,因为 IIRC 对 Dec 的“加 1”是派生的Enum的错误。如果您想将日期作为一个整体使用,则应该有日期时间库。等等。 -
我想计算从日期 1.1.0000 到 X.X.XXXX(基本上任何日期)所经过的分钟数
-
请注意,虽然如果您只想涵盖最常见的情况,这可能是一个很好的学习练习,但要找到正确的日期非常困难,而且有很多例外。例如,因为没有年份 0000,所以没有日期 1.1.0000:我们从公元前 1 年到公元 1 年,中间没有“0 年”。闰年、闰秒、儒略到格里高利转换等。一场噩梦。
标签: haskell algebraic-data-types