Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell错误:无法证明显式类型绑定中的约束是正确的_Haskell - Fatal编程技术网

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