错误无法匹配预期类型'Char'与实际类型'[Char]'

我正在尝试为代表多项式的类型类的show函数构建一个字符串表示。 我不断从'Char'到'[Char]'获取不匹配的类型错误,但是从我的理解来看,haskell的“append”函数应该能够将Char连接到字符串/ [Char]。 我不明白问题出在哪里,或者根据我收到的错误在哪里寻找解决方案。 这里是错误的代码:

newtype Poly a = P [a]

instance (Num a, Show a) => Show (Poly a) where
    show p = ["" : form (p !! i) i | i <- [l,(l-1)..0]]
        where
            l = length p
            form e i 
                | i == 0 = elem
                | i == 1 = elem ++ "x + "
                | otherwise = elem ++ "x^" ++ (show i) ++ " + "
                    where elem = show e

任何帮助将不胜感激,在此先感谢。


你写

从我的理解来看,haskell的“append”函数应该能够将一个Char连接到一个字符串/ [Char]。

我不知道你有什么想法。 这是不对的。 我猜你已经定义了

type Poly a = [a]

我会按照这个假设去做。

instance (Num a, Show a) => Show (Poly a) where

这是错误的。 Poly是一种类型的同义词。 您只能为正确的第一类类型声明实例(将类型构造函数应用于零个或多个类型变量)。 您可以通过使用相反的方式解决此问题,

newtype Poly a = Poly {getPoly :: [a]}

但是您需要根据需要打包/解开Poly数据构造函数。 一旦你得到了这个权利,你可能会看到你提供的Num约束是不必要的。

show p = ["" ++ form (p !! i) i | i <- [(length p)..0]]

有几个问题。 最大的问题是,这并没有定义一个字符串(字符列表),而是定义了一个字符串列表。 通常,通过将concat应用于结果,可以解决此问题。 第二个是"" ++ anything都只是anything ,因为将空列表连接到另一个列表不会做任何事情。 第三个问题是你想倒数,但你做错了。 这个表示法只会计数。 要倒数,你必须表明你想倒数:

let lp = length p in [lp, (lp-1) .. 0]

我立即看到的最后一件事(其中一些错误在前两行中重复):

    | otherwise = e ++ "x^" ++ i ++ " + "

现在i是一个Int ,而++只能用于列表。 所以这是行不通的。 您需要先使用showi转换为字符串。 e的类型为a ,并且需要使用show将其转换为字符串。

链接地址: http://www.djcxy.com/p/43525.html

上一篇: error Couldn't match expected type ‘Char’ with actual type ‘[Char]’

下一篇: Can one compose types in a Haskell instance declaration?