2010-11-29 7 views
2

Ich stolperte über diesen Thread Haskell List Comprehension Und ich versuche jetzt, eine Requisite dafür zu schreiben, die besagt, dass alle Zellen in dieser Funktion eigentlich leer sind, aber nur haben Habe dies soweit mit folgender Fehlermeldung bekommen, als ich versucht habe es zu kompilieren.Brauchen Sie Hilfe Schreiben Prop zu Blak :: Sudoku → [Pos] (Haskell)

{- 
Property that states that all cells in the blanks list are actually blank 
-} 
prop_blank_pos :: Sudoku → Bool 
prop_blank_pos sud = (rows sud) !! (fst pair) !! (snd pair) ≡ Nothing 
    where pair = blanks sud 

could't Spiel erwarteten Typ '(a, b)' gegen abgeleiteten Typ '[pos]' im ersten Argument 'fst'‘namley Paar und das zweite von '(!!)' namley fst Paar im ersten Argument von '(Zeilen) Bankey (' Reihen sud)‘

bearbeiten

Meine Frage ist, ist die Liste, die ich aus Rohlingen erhalten eine Liste [Pos], die [(Nothing, Nothing), (Nichts, Nichts) ... etc].

Ich möchte überprüfen, dass alle Tupel beide Elemente tatsächlich "Nichts" sind, d. H. Alle Elemente in der [Pos] sind (Nichts, nichts). Wie kann ich das überprüfen? Kann jemand ein Codebeispiel schreiben? Ich bin nicht gut in der Haskell-Syntax.

Edit 2

Hier ein Beispiel für eine soduku ist

example :: Sudoku 
    example = 
    Sudoku 
     [ [Just 3, Just 6, Nothing,Nothing,Just 7, Just 1, Just 2, Nothing,Nothing] 
     , [Nothing,Just 5, Nothing,Nothing,Nothing,Nothing,Just 1, Just 8, Nothing] 
     , [Nothing,Nothing,Just 9, Just 2, Nothing,Just 4, Just 7, Nothing,Nothing] 
     , [Nothing,Nothing,Nothing,Nothing,Just 1, Just 3, Nothing,Just 2, Just 8] 
     , [Just 4, Nothing,Nothing,Just 5, Nothing,Just 2, Nothing,Nothing,Just 9] 
     , [Just 2, Just 7, Nothing,Just 4, Just 6, Nothing,Nothing,Nothing,Nothing] 
     , [Nothing,Nothing,Just 5, Just 3, Nothing,Just 8, Just 9, Nothing,Nothing] 
     , [Nothing,Just 8, Just 3, Nothing,Nothing,Nothing,Nothing,Just 6, Nothing] 
     , [Nothing,Nothing,Just 7, Just 6, Just 9, Nothing,Nothing,Just 4, Just 3] 
     ] 

bearbeiten 3 Hier ist, wie Sudoku definiert ist

data Sudoku = Sudoku { rows :: [[Maybe Int]] } 
deriving (Show, Eq) 

Antwort

4

Ich bin nicht sicher, was Sie genau brauchen, Ich sage Ihnen also, was der Compilerfehler bedeutet.

arbeitet auf Tupel (a, b), aber Sie geben es eine [Pos].

Entweder sicherstellen, pair gibt ein Tupel zurück, oder verwenden Sie die Listenfunktionen zum Abrufen des ersten und zweiten Elements, z. head pair für das erste und pair !! 1 für das zweite Element.

Es scheint mir, Sie wollen pair ein Tupel zurückgeben, aber das ist nicht wirklich passiert. blanks sud gibt eine Liste von Pos zurück.


Edit: Okay, also ein Pos ist ein Tupel, und Sie möchten überprüfen, ob ein [Pos] nur Tupel enthält, die (Nothing, Nothing) gleich sind. Wie Dave in den Kommentaren sagte, könnten Sie etwas wie all (==(Nothing, Nothing)) the_list versuchen. Dies gibt True zurück, wenn alle Elemente von the_list gleich (Nothing, Nothing) sind.

prop_blank_pos :: Sudoku -> Bool 
prop_blank_pos sud = all (==(Nothing, Nothing)) (blanks sud) 
+2

Möglicherweise ist 'Paar' eine Liste von Tupeln. Johan müsste dann 'all' verwenden, um die Bedingung für alle Elemente der Liste zu überprüfen. – dave4420

+0

Wenn ich das mache, wie Liszt vorschlägt, erhalte ich die folgende Fehlermeldung: Konnte nicht mit dem erwarteten Typ übereinstimmen '[(Vielleicht a, Vielleicht a1)]' Abgeleitete Art [Pos] Im zweiten Argument von 'all', namley (Leerzeichen sud) ' In dem Ausdruck all (≡ (Nichts, nichts)) (Leerzeichen sud) Irgendwelche haben eine Idee, wie man den Compiler bitte, um dieses zum Funktionieren zu bringen? :) – Darren

+0

Nach dem Laden Ihres Moduls in Ghci, was ist die Ausgabe von ': ich Pos'? Was ist die Ausgabe von ': t Leerzeichen '? Der Compiler sagt dir, Pos kann niemals "(Nichts, Nichts) sein", also macht es keinen Sinn, sie mit diesen Werten zu vergleichen. –