2012-04-12 4 views
0

Ich habe diesen Code seit fast 2 Stunden, und ich bekomme immer die gleiche Compiler-Fehlermeldung. Ich habe meine Forschung getan, aber kann nur keine Antwort findenListe der Listen in der Typdeklaration in Haskell

buildTable :: Int -> Int -> (Int -> Int -> a) -> [[a]] 

buildTable n m fun = [[ fun x y 
        | x <- [0..n-1]] 
        | y <- [0..m-1]] 


lookupAns :: Int -> Int -> [[Int]] -> Int 
lookupAns len1 len2 theArray = 
    theArray !! len1 !! len2 


lcsLength :: String -> String -> Int 
lcsLength s1 s2 = 
    let 
    n1 = (length s1) 
    n2 = (length s2) 
    table = buildTable (n1 n2 lcsHelp) 

    lcsHelp = if (n1 == 0 || n2 == 0) 
       then 0 

       else if (last s1 == last s2) 

       then      
        (lookupAns 
         (n1 - 1) 
         n2 
         table) 
         + 1 
       else 
        max 
         (lookupAns 
          n1 
          (n2-1) 
          table) 
         (lookupAns 
          (n1-1) 
          n2 
          table) 





    in lookupAns 
     (length s1) 
     (length s2) 
     table 

Jetzt bekomme ich die gleiche Fehlermeldung, egal was ich versuche. Die Fehlermeldung lautet "Konnte nicht dem erwarteten Typ entsprechen [[Int]] -> Int 'mit dem tatsächlichen Typ [Int]" Mit anderen Spezifikationen, die auf den ersten Aufruf von max gegen Ende des Codes zeigen. Bitte helfen Sie, das ist wirklich frustrierend

Es kompiliert jetzt und läuft mit meinem neuen Code. Ich werde sicher sein, es später zu posten, da es etwas spät wird, und ich werde das für die Nacht hinstellen.

+0

Beachten Sie, dass Listen sind nicht sehr gut für diese Art von Sache, da sie einen großen Overhead in Bezug auf den Platz und eine langsame _O (n) _ Indizierung haben. Sie sind in Ordnung für kleine Fälle oder Prototyping, aber für etwas ernstes sollten Sie wahrscheinlich in die Verwendung von Arrays oder Vektoren stattdessen suchen. – hammar

Antwort

1

Das erste lookupAns in lcslength wird auf zu wenige Argumente angewendet.

+0

das war ein Tippfehler – user1327964

4

Das ist falsch:

table = buildTable (n1 n2 lcsHelp) 

buildTable hat geben. buildTable (n1 n2 lcsHelp) wendet es auf ein Argument an, nämlich (n1 n2 lcsHelp). So table würde Typ Int -> (Int -> Int -> a) -> [[a]], die ungültig ist, als das dritte Argument zu lookupAns übergeben werden.

Vergesst, dass (n1 n2 lcsHelp) versucht, eine ganze Zahl n1 auf zwei Dinge anzuwenden, die offensichtlich Müll ist.

Ich bekomme nicht die Fehlermeldung, die Sie angeben, obwohl. GHCi gibt mir:

Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 
[1 of 1] Compiling Main    (bar.hs, interpreted) 

bar.hs:18:13: 
    Couldn't match expected type `[[Int]]' 
       with actual type `Int -> (Int -> Int -> a0) -> [[a0]]' 
    In the return type of a call of `buildTable' 
    In the expression: buildTable (n1 n2 lcsHelp) 
    In an equation for `table': table = buildTable (n1 n2 lcsHelp) 

Ich bin nicht sicher, ob das ist, weil der Code, den Sie geschrieben haben eigentlich nicht der Code Sie Ihre Fehlermeldung kompiliert (die auf die Tatsache hingewiesen, dass man musste korrigieren Sie einen Tippfehler), oder nur, dass GHCi die Inkonsistenz an einem anderen Punkt als den verwendeten Compiler aufgreift.

Ich vermute, Sie wahrscheinlich gemeint:

table = buildTable n1 n2 lcsHelp 

Aber das gibt mir wieder andere Fehler.

0

Ich habe den Code auf hpaste eingefügt, so dass es einfacher ist, das Problem herauszufinden. Wie @Ben bereits darauf hingewiesen hat, ist das Problem der Typ table.

buildTable Funktion hat den Typ . Sie nennen es als table = buildTable (n1 n2 lcsHelp). Der Typ table lautet also Int -> (Int -> Int -> a) -> [[a]]. Dieser Typ ist ungültig die lookupAns Funktion zu übergeben, die den Typ Int -> Int -> [[Int]] -> Int

hat Und wenn Sie so etwas wie dieses table = buildTable n1 n2 lcsHelp tun waren, die ich glauben könnte, Ihre Absicht, dann die Art Signatur für buildTable sein muss sich ändern, wie du willst begegnet diesen Fehler

Couldn't match expected type `Int -> Int -> Int' 
      with actual type `Int' 
In the third argument of `buildTable', namely `lcsHelp' 

Und dies geschieht, weil jetzt die lcsHelp-Funktion, die ein Int (aus den if..else Aussagen wegen des Rückgabewertes) gibt nicht die tatsächliche Art der buildTable Funktion entspricht.

Also, wenn Sie ein wenig mehr erklären können, was Sie erreichen wollen, wird es einfacher sein, Ihnen zu helfen. Am wahrscheinlichsten ist der Typ der lcsHelp Funktion, den Sie erneut besuchen müssen. Möglicherweise muss die buildTable Funktion keine Funktion als Eingabeparameter übernehmen.

0

paar Kommentare 1. lcsHelp nimmt keine args 2. lookupAns in else-if-then falsche Argumente übernimmt, table fehlt

Ich habe ein wenig modifiziert: http://hpaste.org/66862