所以我有一个问题...我必须为我的大学课程编写一个程序,在其中计算出确切的天数
例如
日期1月1日(0001)为1 而2018年7月26日将为736412
在下面,我试图解决这个问题,但是没有运气。你能指出我的错误吗?
type Date = (Int, Int, Int)
type Year = Int
type Month = Int
type Day = Int
datetoday :: Date -> Int
datetoday (year, month , day) = day + monthtoday month + yeartoday year
yeartoday :: year -> day
yeartoday year = ((year-1)*365)
monthtoday :: month -> day
monthtoday month
|month 1 = 0
|month 2 = 31
|month 3 = 59
|month 4 = 90
|month 5 = 120
|month 6 = 151
|month 7 = 181
|month 8 = 211
|month 9 = 243
|month 10 = 273
|month 11 = 304
|month 12 = 334
答案 0 :(得分:3)
您的代码有两个问题:
yeartoday :: year -> day
year
和day
应该大写。如果您不这样做,则它等效于a -> b
,因为未大写的标识符被视为类型变量。这适用于您的其他签名。因此,应该是:
yeartoday :: Year -> Day
其他签名也一样。
这是第二个问题。
monthtoday month
|month 1 = 0
|month 2 = 31
(...)
您写month 1
,month 2
等的部分期望一个Bool
,因此您需要比较month
和每个值,因此应该是:>
monthtoday month
|month == 1 = 0
|month == 2 = 31
(...)
但更好的是,您应该将其重写为:
monthtoday month = case month of
1 -> 0
2 -> 31
(..)
还有其他一些与正确性有关的错误,并且还有更好的方法来解决这个问题,但是我会把这个问题留给您,因为这里的问题与类型系统有关。