0

私はほぼ 2 時間このコードに取り組んでいますが、同じコンパイラ エラー メッセージが表示され続けます。私は自分の研究をしましたが、答えを見つけることができません

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

何を試しても同じエラーメッセージが表示されるようになりました。エラー メッセージは、" 期待される型 '[[Int]] -> Int' と実際の型 [Int] を一致させることができませんでした" であり、他の仕様はコードの最後にある max の最初の呼び出しを指しています。助けてください、これは本当にイライラします

これで、新しいコードでコンパイルして実行できます。ちょっと遅くなってきたので、後で必ず投稿します。これは夜に置いておきます。

4

4 に答える 4

4

これは間違っています:

table = buildTable (n1 n2 lcsHelp)

buildTableタイプがありInt -> Int -> (Int -> Int -> a) -> [[a]]ます。buildTable (n1 n2 lcsHelp)は、それを 1 つの引数、つまり に適用しています(n1 n2 lcsHelp)。そのため、 の 3 番目の引数として渡すのは無効なtabletypeになります。Int -> (Int -> Int -> a) -> [[a]]lookupAns

(n1 n2 lcsHelp)整数を 2 つのものに適用しようとしていることは気にしないn1でください。これは明らかなゴミです。

ただし、引用したエラーメッセージは表示されません。GHCiは私に与えます:

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)

あなたが投稿したコードが実際にはエラーメッセージを取得するためにコンパイルしたコードではないためなのか (これはタイプミスを修正しなければならなかったという事実によって示唆されています)、それとも単に GHCi が選んでいるからなのかはわかりません。使用しているコンパイラとは異なる時点で不整合を改善してください。

おそらくあなたは次のことを意味していたと思います:

table = buildTable n1 n2 lcsHelp

しかし、それは私に別のエラーを再び与えます。

于 2012-04-12T03:07:21.687 に答える
1

lcslength の最初の lookupAns が適用される引数が少なすぎます。

于 2012-04-12T02:10:42.193 に答える
0

いくつかのコメント 1.lcsHelp引数を取らない 2. lookupAnselse -if-thenで間違った引数を取る、欠落しているtable

私は少し変更しました: http://hpaste.org/66862

于 2012-04-12T15:18:52.000 に答える
0

問題を見つけやすくするために、コードをhpasteに貼り付けました。@Ben がすでに指摘したように、問題はtable.

buildTable関数の型はInt -> Int -> (Int -> Int -> a) -> [[a]]です。と呼んでいtable = buildTable (n1 n2 lcsHelp)ます。したがって、 の型はtableになりますInt -> (Int -> Int -> a) -> [[a]]lookupAnsこの型は、次の型を持つ関数に渡すには無効ですInt -> Int -> [[Int]] -> Int

そして、あなたがtable = buildTable n1 n2 lcsHelpあなたの意図であると私が信じているこのようなことをした場合buildTable、このエラーが発生するため、型シグネチャを変更する必要があります

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

これは、 (ステートメントからの戻り値のためにlcsHelp) を返す関数が関数の実際の型と一致しないために発生します。Intif..elsebuildTable

そのため、達成しようとしていることについてもう少し詳しく説明していただけると、お手伝いがしやすくなります。ほとんどの場合、lcsHelp関数の型を再検討する必要があります。関数buildTableが入力パラメーターとして関数を受け取る必要がない場合があります。

于 2012-04-12T03:59:20.460 に答える