2016-11-14 6 views
0

Ich habe den folgenden Code in HaskellInstanziierung Fehler in 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 

Wenn ich versuche, es in den Umarmungen Interpreter auszuführen, habe ich folgende Fehlermeldung:

ERROR Instance of Num (Int -> Int) required for definition of days 

Der Fehler ist in der letzten Zeile meines Codes, FYI.

Kann mir jemand erklären, warum ich diesen Fehler habe? Ich kann nicht herausfinden, wie mein Funktionsaufruf nicht mit meiner Funktionsdeklaration übereinstimmt.

+0

Chepner antwortete, bevor ich konnte, aber nur um ein wenig Kontext zu seiner (richtigen!) Antwort hinzuzufügen, falls es Ihnen hilft - in Haskell, Funktion Definition/Anwendung erfolgt mit Leerzeichen statt Klammern und Kommas. Dies führt dazu, dass viele Leute aus C-ähnlichen Sprachen kommen - was "x (y, z)" bedeutet, wird zu "x y z". –

+0

Diese Frage ergibt sich eindeutig aus der Sicht des Lernens Haskell; für jeden, der diese Frage durch Suchen findet und versucht, Haskell zu verwenden (statt zu lernen), werfen Sie einen Blick auf [gregorianMonthLength] (http://hackage.haskell.org/package/time-1.6.0.1/docs/ Data-Time-Calendar.html # v: gregorianMonthLength) aus dem Paket 'time' für diese Funktionalität. –

Antwort

3

Ihre Typdeklaration besagt, dass days (ignoriert Curry) zwei Argumente. Ihre Definition besagt jedoch, dass days ein einzelnes Tupel als Argument verwendet. Ändern Sie den Typ zu

days :: Month -> Int 
days (m, d) = 31 

oder die Definition ändern

days :: Month -> Int -> Int 
days (m, d) x = 31 

je nachdem, was days tun soll.

Ihre Definition gibt nur das erste der beiden erwarteten Argumente für Ihren Typ an. Seit days :: Month -> Int -> Int, dann days (m, d) :: Int -> Int. Da Sie angegeben haben, dass der Rückgabewert 31 war (mit dem Typ Num a => a), versuchte Haskell, a mit Int -> Int zu vereinheitlichen. (Das heißt, behandelt 31 als eine Funktion, die eine Ganzzahl nimmt und eine ganze Zahl zurückgibt.) Es gibt keine Num Instanz für Int -> Int, daher der Fehler.