2016-11-14 4 views
0

Я следующий код в 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 

Ошибка расположенный на последней строке моего кода, FYI.

Может ли кто-нибудь объяснить мне, почему у меня есть эта ошибка? Я не могу понять, как мой вызов функции не соответствует объявлению моей функции.

+0

Chepner ответил, прежде чем я смог, но просто добавлю немного контекста к его (правильному!) Ответу, если он вам поможет - в Haskell определение функции/приложение выполняется с использованием пробелов, а не скобок и запятых. Это приводит к тому, что многие люди переходят из C-подобных языков - что будет 'x (y, z)' становится 'x y z'. –

+0

Этот вопрос явно исходит из точки зрения обучения Haskell; однако, для тех, кто находит этот вопрос путем поиска и пытается использовать (а не учиться) Haskell, посмотрите на [gregorianMonthLength] (http://hackage.haskell.org/package/time-1.6.0.1/docs/ Data-Time-Calendar.html # v: gregorianMonthLength) из пакета 'time' для этой функции. –

ответ

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, следовательно, ошибка.