haskell:递归中的类型不匹配错误

时间:2017-02-28 15:17:13

标签: haskell recursion

我有这样的递归函数;

elim_all :: Idx -> Idx -> Idx -> Idx -> Mat El -> Mat El
elim_all c r1b r1e r2 m
     | r1b == r1e = elim_one c r1b r2 m
     | otherwise = elim_one c r1b r2 m : elim_all c (r1b+1) r1e r2 m

elim_one函数是;

elim_one :: Idx -> Idx -> Idx ->  Mat El -> Mat El
elim_one c r1 r2 m = let val1 = ((m!!r1)!!c)
                         val2 = ((m!!r2)!!c)
                         row1 = (mulr r1 val2 m)!!r1
                         row2 = (mulr r2 val1 m)!!r2
                         nrow = zipWith (-) row1 row2
                         matr = if r1 == r2
                                     then m
                                     else replacer r1 nrow m
                      in matr

当我运行它时,我收到以下错误:

    Couldn't match type ‘[El]’ with ‘Int’
    Expected type: [El]
      Actual type: Mat El
    In the first argument of ‘(:)’, namely ‘elim_one c r1b r2 m’
    In the expression:
      elim_one c r1b r2 m : elim_all c (r1b + 1) r1e r2 m

错误对我来说仍然没有意义。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

所以这是有问题的一行:

| otherwise = elim_one c r1b r2 m : elim_all c (r1b+1) r1e r2 m

现在您已在类型签名中说明elim_all的结果*为Mat El,但在此行中结果是一个列表(即(:)运算符形式)。

在不了解Mat类型的更多内容的情况下,我最好的猜测是您需要将此案例的输出包装在Mat的类型构造函数中。

*完全应用该功能时。

答案 1 :(得分:2)

elim_oneelim_all都会计算Mat E1类型的内容。但不管这可能是什么,因为

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

并且对于所有类型x,它认为x[x]不一样,你永远不会 将elim_oneelim_all的评估结果与(:)运算符相关联。