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)将其应用于一个论点,即(n1 n2 lcsHelp)。所以table会有 type Int -> (Int -> Int -> a) -> [[a]],它作为第三个参数传递给 是无效的lookupAns

没关系,(n1 n2 lcsHelp)试图将整数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返回 an 的函数Int(因为if..else语句的返回值)与函数的实际类型不匹配buildTable

所以,如果你能多解释一下你想要达到的目标,帮助你会更容易。该函数的类型很可能lcsHelp是您需要重新访问的。可能是buildTable函数不需要将函数作为输入参数。

于 2012-04-12T03:59:20.460 回答