2016-08-05 13 views
0

Ich habe das folgende Problem: bei einer maximalen (max) Kapazität, und eine Liste von Werten (listOfValues) muss ich eine Liste mit Werten aus der listOfValues. Die Summe der Elemente muss < = max und ich muss die höheren Werte priorisieren.Fehler beim Drucken der Liste in Haskell

Beispiel: Eingabe solvingProblem 103 [15, 20, 5, 45, 34] ich muß erhalten: [45, 45, 5, 5]

Zur Lösung des Problems i den folgenden Code erstellen:

solvingProblem max [] = 0 
solvingProblem max listOfValues | max == 0 = 0 
           | otherwise = createList max listOfValues [] 


createList max [] result = -1 
createList max listOfValues result | smaller listOfValues > max = -1 
           | higher listOfValues > max = createList max (remove (higher listOfValues) listOfValues) result 
           | otherwise = createList (max - higher listOfValues) listOfValues (insert (higher listOfValues) result) 

higher [a] = a 
higher (a:b:x) | a > b = higher (a:x) 
       | otherwise = higher (b:x) 

smaller [a] = a 
smaller (a:b:x) | a < b = smaller (a:x) 
       | otherwise = smaller (b:x) 

remove x [] = [] 
remove x (h:t) | x == h = remove x t 
       | otherwise = h : remove x t 

insert x (h:t) = x : h : t 

In den zwei Zeilen, in denen ich "-1" zurückgeben werde, sollte der Parameter "result" sein, aber wenn ich "-1" in "result" ändere, wird der Code nicht auf ghci geladen.

Kann mir jemand helfen?

Vielen Dank und Entschuldigung für mein schlechtes Englisch.

+0

Fügen Sie immer Signaturen für Ihre Funktionen hinzu. Sie machen den Code lesbarer und idiomatischer, und vor allem lässt GHC Ihre Funktionen in der Tat zurückgeben, was Sie beabsichtigen, und verbessert häufig die Typfehlermeldungen erheblich. Wenn Sie in Zukunft bei SO nachfragen, wenn Sie vom Compiler einen Fehler erhalten, posten Sie es!Es enthält wertvolle Informationen für uns, selbst wenn es Ihnen wenig sagen könnte. – chi

Antwort

3

Wenn ich mit einer Seitennotiz beginnen kann, existieren einige Ihrer Funktionen bereits in Haskell (jetzt, da ich darüber nachdenke, hättest du sie vielleicht für eine Übung geschrieben, aber nur für den Fall, dass es nicht funktionieren würde Seien Sie der Fall, lassen Sie uns das besprechen): Ihr higher ist maximum, Ihr smaller ist minimum und Ihr Einsatz ist nur (:), weil Sie wie Sie es selbst schreiben insert x list = x:list. Beachten Sie, dass Ihre Version fehlschlägt, wenn Sie die leere Liste angeben, da die Mustererkennung nicht erschöpfend ist. Auch könnten Sie remove in Bezug auf Filter schreiben: remove x list = filter (== x) list.

Warum wird Ihr Code nicht richtig geladen? ghci sagt Ihnen:

• Non type-variable argument in the constraint: Num [a] 
    (Use FlexibleContexts to permit this) 
• When checking the inferred type 
    solvingProblem :: forall a. 
         (Ord a, Num [a], Num a) => 
         a -> [a] -> [a] 

Welche Ich stimme ziemlich kryptisch, aber was es sagen will, ist, dass der Rückgabetyp von solvingProblem ist eine Liste von a und aus irgendeinem Grund ist es auch eine Instanz der Num Typklasse. Der Grund, warum es sagt, es ist eine Instanz von Num ist, weil einer der Rückgabewert solvingProblem0 ist, die eine Zahl ist, die ein bisschen seltsam ist, weil es auch eine Liste ist. Ändern der 0 mit [] macht den Code kompilieren und arbeiten (wenn Sie insert mit (:) ändern, sonst erhalten Sie die nicht erschöpfende Mustererkennung, über die ich früher gesprochen habe).

λ> solvingProblem 103 [15,20, 5, 45, 34] 
[5,5,45,45] 
it :: (Ord t, Num t) => [t] 
+0

Hallo villou24. Danke für Ihre Antwort. Ich denke, ich verstehe, was Sie gesagt haben, aber ich änderte loadingProblem max [] = 0 lovingProblem max listOfValues ​​| max == 0 = 0 bis solvingProblem max [] = [] solvingProblem max listOfValues ​​| max == 0 = [] und es kompiliert nicht –

+0

Haben Sie die '-1' mit' result' geändert? Was ist der Fehler? – villou24

+0

jetzt tat ich (:. Entschuldigung dafür. Es kompiliert jetzt. Der Fehler ist jetzt nicht erschöpfende Muster in der Funktion einfügen, wahrscheinlich Semantik Problem. Ich werde versuchen, dies jetzt zu lösen. Vielen Dank –

1

Das Problem ist mit der letzten Wächterklausel in createList.

Der Typ, den Sie für createList bestimmt zu sein scheint:

createList :: Int -> [Int] -> Int -> Int 

aber wenn man in der letzten Wache Klausel suchen Sie haben:

| otherwise = createList (max - ...) listOfValues (insert ...) 
         ^^^^^^^^^^^ ^^^^^^^^^^^^ ^^^^^^^^^^^^ 
          Int  [Int]  [Int] 

Obwohl GHC bei Folgern Typen sehr gut, immer Typ Signaturen zu Ihrem Code hinzufügen, ist eine gute Möglichkeit, diese Arten von Fehlern früh zu fangen.

+0

Hallo ErikR. Danke für Ihre Antwort. Was ich am Ende von allem zurückgeben muss, ist eine Liste von ganzen Zahlen. typing solvingProblem 103 [15, 20, 5, 45, 34] zum Beispiel muss ich bekommen: [45, 45, 5, 5] –

+1

Fügen Sie Signaturen zu all Ihren Funktionen hinzu und ich werde einen anderen Blick darauf werfen. – ErikR

+1

In der Tat, nachdem Sie Typ-Signaturen hinzugefügt haben, könnte das Problem viel offensichtlicher sein. – ErikR