我正在尝试为表示多项式的类型类的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
任何帮助都将非常感谢,提前谢谢。
答案 0 :(得分:5)
你写
从我的理解haskell&#34;追加&#34; function应该能够将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
,++
仅适用于列表。这样就行不通了。您需要先使用i
将show
转换为字符串。 e
的类型为a
,并且需要使用show
转换为字符串。