我在 Haskell
中有以下代码type Year = Int
data MonthData = Jan | Feb | March | Apr | Mar | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec deriving ( Eq, Show, Ord )
type Month = ( MonthData, Year )
days :: Month -> Int -> Int
days( m, d ) = 31
当我尝试在Hugs解释器中执行它时,我有以下错误:
ERROR Instance of Num (Int -> Int) required for definition of days
错误位于我的代码的最后一行,仅供参考。
有人能解释我为什么会出现这个错误吗?我无法弄清楚我的函数调用与函数声明的匹配程度。
答案 0 :(得分:3)
你的类型声明说days
(忽略currying)有两个参数。但是,你的定义是days
将一个元组作为参数。将类型更改为
days :: Month -> Int
days (m, d) = 31
或将定义更改为
days :: Month -> Int -> Int
days (m, d) x = 31
取决于days
应该做什么。
您的定义仅指定给定类型的两个参数中的第一个。自days :: Month -> Int -> Int
起,然后days (m, d) :: Int -> Int
。由于您说返回值为31
(类型为Num a => a
),因此Haskell尝试将a
与Int -> Int
统一起来。 (也就是说,将31
视为一个取整数并返回整数的函数。)Num
没有Int -> Int
个实例,因此错误。