Haskell错误:无法证明显式类型绑定中的约束是正确的
这是我的代码Haskell错误:无法证明显式类型绑定中的约束是正确的,haskell,Haskell,这是我的代码 seconds :: (Int,Int) -> (Int,Int,Int) -> Int seconds (d,mm) (h,m,s) | d > 31 = 0 | d < 1 = 0 | mm > 12 = -1 | mm < 1 = -1 | h > 24 = -1 | h < 0 = -1 | m > 59 = -1 | m < 0 = -1 | s > 59 = -1
seconds :: (Int,Int) -> (Int,Int,Int) -> Int
seconds (d,mm) (h,m,s)
| d > 31 = 0
| d < 1 = 0
| mm > 12 = -1
| mm < 1 = -1
| h > 24 = -1
| h < 0 = -1
| m > 59 = -1
| m < 0 = -1
| s > 59 = -1
| s < 0 = -1
| otherwise = ((ceiling(div (mm-1) 2) * 31 + floor(div mm-1 2) * 30)-2 + (d-1))*86400 + (h-1)*3600 + m * 60 + s
有什么帮助吗?我想如果你能首先简化你的表达,可能会有所帮助。现在情况很复杂 它不起作用的核心原因是:
div mm - 1 2
它们被解析为:
(div mm) - (1 2)
这意味着div mm
应该是一个数字(因为使用了(::Num a=>a->a->a
函数),而1
应该是一个函数,因为您将它应用于2
你应该写:
div (mm-1) 2
相反:
seconds :: (Int,Int) -> (Int,Int,Int) -> Int
seconds (d,mm) (h,m,s)
| d > 31 = 0
| d < 1 = 0
| mm > 12 = -1
| mm < 1 = -1
| h > 24 = -1
| h < 0 = -1
| m > 59 = -1
| m < 0 = -1
| s > 59 = -1
| s < 0 = -1
| otherwise = ((div (mm-1) 2) * 31 + (div (mm-1) 2)*30 - 2 + (d-1))*86400 + (h-1) * 3600 + m * 60 + s
然后我们可以定义一个函数,如:
seconds :: (Int,Int) -> (Int,Int,Int) -> Int
seconds (d,mm) (h,m,s)
| d > 31 || d < 1 || mm > 12 || mm < 1 = -1
| h > 24 || h < 0 || m > 59 || m < 0 || s > 59 || s < 0 = -1
| otherwise = (d + daysOffset mm) * 86400 + secondsOfDay h m s
seconds::(Int,Int)->(Int,Int,Int)->Int
秒(d,mm)(h,m,s)
|d>31 | d<1 | mm>12 | mm<1=-1
|h>24 | h<0 | m>59 | m<0 | s>59 | s<0=-1
|否则=(d+日设置毫米)*86400+日设置秒
这就假设我们不计算闰年的秒数。此外,在现实中,日历经常被调整。例如,1582年引入了闰年规则,例如改变了闰年规则。此外,还经常引入修正地球自转的不一致性。因此,上面的函数不是计算精确秒数的精确方法。ceiling
无法应用,因为它适用于RealFrac
类型,但无论如何它都是无用的,因为div
会向零截断。的确,但这不是算术表达式的唯一问题。如果没有其他内容,div mm-12
缺少一些括号。尝试通过为大型复杂表达式的子部分定义一些辅助函数来拆分表达式,以便更容易理解。
secondsOfDay :: Int -> Int -> Int -> Int
secondsOfDay h m s = 3600 * h + 60 * m + s
daysOffset :: Int -> Int
daysOffset 1 = 0
daysOffset 2 = 31
daysOffset 3 = 60
daysOffset 4 = 91
daysOffset 5 = 121
daysOffset 6 = 152
daysOffset 7 = 182
daysOffset 8 = 213
daysOffset 9 = 244
daysOffset 10 = 274
daysOffset 11 = 305
daysOffset 12 = 335
seconds :: (Int,Int) -> (Int,Int,Int) -> Int
seconds (d,mm) (h,m,s)
| d > 31 || d < 1 || mm > 12 || mm < 1 = -1
| h > 24 || h < 0 || m > 59 || m < 0 || s > 59 || s < 0 = -1
| otherwise = (d + daysOffset mm) * 86400 + secondsOfDay h m s