我周四有一场关于函数式编程的考试,我很确定我必须用多项式做 TAD。我暂时添加多项式,如下所示:
type Pol = [(Int,Int)]
suma :: Pol -> Pol -> Pol
suma [] ys = ys
suma xs [] = xs
suma ((c1,g1):xs) ((c2,g2):ys)
| g1 == g2 = ((c1+c2,g1):(suma xs ys))
| g1 > g2 = ((c1,g1):(suma xs ((c2,g2):ys)))
| g1 < g2 = ((c2,g2):(suma ((c1,g1):xs) ys))
效果很好,但老师不喜欢。她更喜欢这样做:
data Pol = P [(Int,Int)] deriving Show
一开始,我以为改变结构很容易,但事实并非如此,因为我在编译时遇到了很多麻烦。有人可以帮我吗?我尝试了这种方法,但不起作用:
data Pol = P [(Int,Int)] deriving Show
suma :: Pol -> Pol -> Pol
suma (P []) (P ys) = P ys
suma (P xs) (P []) = P xs
suma (P ((c1,g1):xs)) (P ((c2,g2):ys))
| g1 == g2 = P ((c1+c2,g1):suma (P xs) (P ys))
| g1 > g2 = P ((c1,g1):(suma (P xs) (P ((c2,g2):ys))))
| g1 < g2 = P ((c2,g2):(suma (P ((c1,g1):xs)) (P ys)))
我收到此错误:
ERROR file:.\Febrero 2011.hs:7 - Type error in application
*** Expression : P (c1 + c2,g1) : suma (P xs) (P ys)
*** Term : suma (P xs) (P ys)
*** Type : Pol
*** Does not match : [a]
非常感谢!
最佳答案
如果某些内容不起作用,请在问题中解释原因。如果有编译错误,请发布。
在本例中,问题是 suma
最后一个分支中的类型错误。看看
suma (P ((c1,g1):xs)) (P ((c2,g2):ys))
| g1 == g2 = P ((c1+c2,g1):suma (P xs) (P ys))
在 P ((c1+c2,g1):suma (P xs) (P ys))
中,您尝试创建 [(Int,Int) 类型的列表)]
与
(c1+c2,g1):suma (P xs) (P ys)
您正在尝试构造一个列表,其头部为 (Int,Int)
类型,但尾部为 Pol
类型( 的结果类型)苏玛
)。其他案例也有类似的错误。
关于haskell - Haskell 中的多项式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7232854/