haskell - Haskell 中的多项式

标签 haskell functional-programming

我周四有一场关于函数式编程的考试,我很确定我必须用多项式做 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/

相关文章:

haskell - 为什么这个 Haskell 代码会编译?

javascript - 使我的 readPackageFiles 符合 "Parallel"函数

javascript - 纯函数可以异步吗?

scala - 在 Scala + JDBC 中避免可变变量

recursion - 如何根据 reduce 定义 map、filter 和 reverse 等操作?

haskell - Data Parallel Haskell 中的 PArray 和 [::] 有什么区别?

haskell - getDataFileName 返回一个不存在的目录

clojure - 关于 Vars Clojure 的问题

haskell - 如何将函数映射到列表并在满足条件时停止并告诉我它是停止还是到达末尾?

multithreading - Haskell 中的随机数生成器是线程安全的吗?