Haskell中的实例化错误

时间:2016-11-14 14:57:26

标签: haskell

我在 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

错误位于我的代码的最后一行,仅供参考。

有人能解释我为什么会出现这个错误吗?我无法弄清楚我的函数调用与函数声明的匹配程度。

1 个答案:

答案 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尝试将aInt -> Int统一起来。 (也就是说,将31视为一个取整数并返回整数的函数。)Num没有Int -> Int个实例,因此错误。