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

Mar*_*ick 1 haskell typeclass

我正在尝试为表示多项式的类型类的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
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激,谢谢你提前.

dfe*_*uer 5

你写

根据我的理解,haskell的"append"函数应该能够将Char连接到字符串/ [Char].

我不知道你在哪里有这个想法.这是不对的.我猜你已定义了

type Poly a = [a]
Run Code Online (Sandbox Code Playgroud)

我会按照这个假设去做.

instance (Num a, Show a) => Show (Poly a) where
Run Code Online (Sandbox Code Playgroud)

这是错的.Poly是一个类型的同义词.您只能为正确的第一类类型声明实例(将类型构造函数应用于零个或多个类型变量).您可以通过使用,而不是,

newtype Poly a = Poly {getPoly :: [a]}
Run Code Online (Sandbox Code Playgroud)

但是你需要根据需要包装/解包Poly数据构造函数.一旦你做对了,你可能会发现Num你给出的约束是不必要的.

show p = ["" ++ form (p !! i) i | i <- [(length p)..0]]
Run Code Online (Sandbox Code Playgroud)

有一些问题.最重要的是,这不是定义字符串(字符列表)而是定义字符串列表.通常,您可以通过应用concat结果来解决此问题.第二个是,"" ++ anything只是anything,因为串联空列表到另一个列表不会做任何事情.第三个问题是你试图倒计时,但你做错了.这种表示法只会起作用.要倒计时,你必须表明你想要倒计时:

let lp = length p in [lp, (lp-1) .. 0]
Run Code Online (Sandbox Code Playgroud)

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

    | otherwise = e ++ "x^" ++ i ++ " + "
Run Code Online (Sandbox Code Playgroud)

现在i是一个Int,++只适用于列表.这样就行不通了.您需要先使用转换i为字符串show.e是类型a,也需要使用转换为字符串show.