怎么把Haskell中的日期转换成天?

时间:2018-07-24 17:17:20

标签: haskell

所以我有一个问题...我必须为我的大学课程编写一个程序,在其中计算出确切的天数

例如

日期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

1 个答案:

答案 0 :(得分:3)

您的代码有两个问题:

yeartoday :: year -> day

yearday应该大写。如果您不这样做,则它等效于a -> b,因为未大写的标识符被视为类型变量。这适用于您的其他签名。因此,应该是:

yeartoday :: Year -> Day

其他签名也一样。

这是第二个问题。

monthtoday month
     |month 1 = 0
     |month 2 = 31
     (...)

您写month 1month 2等的部分期望一个Bool,因此您需要比较month和每个值,因此应该是:

monthtoday month
     |month == 1 = 0
     |month == 2 = 31
     (...)

但更好的是,您应该将其重写为:

monthtoday month = case month of
    1 -> 0
    2 -> 31
    (..)

还有其他一些与正确性有关的错误,并且还有更好的方法来解决这个问题,但是我会把这个问题留给您,因为这里的问题与类型系统有关。