如何在代码中调用一个函数来return次多项式?

How to call a function inside the code to return the degree of a polynomial?

在haskell's Poly package polynomials like x**2 + -1 are represented by [ -1, 0, 2] 所以为了计算多项式的次数,我需要计算长度多项式列表的 - 1.

这是我所做的:

polyDegree :: (Num a, Eq a) => Poly a -> Int
polyDegree p = rawPolyDegree (trim (0==) p)

rawPolyDegree :: Poly a -> Int
rawPolyDegree p = rawPolyLength p - 1

rawPolyLength :: Poly a -> Int
rawPolyLength (ListPoly    _ _ cs) =    length cs
rawPolyLength (VectorPoly  _ _ cs) =  V.length cs
rawPolyLength (UVectorPoly _ _ cs) = UV.length cs

我试图编译这段代码。但不起作用此代码输出此错误

 ghc -o main main.hs
[1 of 1] Compiling Main             ( main.hs, main.o )

main.hs:1:32: error: Not in scope: type constructor or class `Poly'
  |
1 | polyDegree :: (Num a, Eq a) => Poly a -> Int
  |                                ^^^^

main.hs:4:18: error: Not in scope: type constructor or class `Poly'
  |
4 | rawPolyDegree :: Poly a -> Int
  |                  ^^^^

main.hs:7:18: error: Not in scope: type constructor or class `Poly'
  |
7 | rawPolyLength :: Poly a -> Int
  |                  ^^^^

main.hs:8:16: error: Not in scope: data constructor `ListPoly'
  |
8 | rawPolyLength (ListPoly    _ _ cs) =    length cs
  |                ^^^^^^^^

main.hs:9:16: error: Not in scope: data constructor `VectorPoly'
  |
9 | rawPolyLength (VectorPoly  _ _ cs) =  V.length cs
  |                ^^^^^^^^^^

main.hs:9:39: error:
    Not in scope: `V.length'
    No module named `V' is imported.
  |
9 | rawPolyLength (VectorPoly  _ _ cs) =  V.length cs
  |                                       ^^^^^^^^

main.hs:10:16: error: Not in scope: data constructor `UVectorPoly'
   |
10 | rawPolyLength (UVectorPoly _ _ cs) = UV.length cs
   |                ^^^^^^^^^^^

main.hs:10:38: error:
    Not in scope: `UV.length'
    No module named `UV' is imported.
   |
10 | rawPolyLength (UVectorPoly _ _ cs) = UV.length cs
   |                                      ^^^^^^^^^
exit status 1

我在堆栈溢出中研究了关于编译 haskell 函数的问题,我发现了一个关于简单代数函数的问题 我明白我的问题是我没有指示Haskell程序应该做什么这个问题的答案是这样的:

main :: IO ()
main = print (f 2)

因此,根据这个问题,需要将其放在我的代码中的某处,但我不知道我必须将此函数的值放在哪里?

我正在学习 Haskell 2016 Graham Hutton 第 2 版的编程,这本书说学习如何编译代码片段并不重要,但我想编译这些代码片段以检查我的代码是否 运行.我是 haskell 的新人,我正在学习并对功能范式感兴趣。为此,我正在使用 GHCi,版本 8.6.5 在线编译器。

我没看过这本书,但我的印象是它不打算让你在这里使用第三方包。

相反,直接使用列表[k] 类型和长度 n 的列表可以表示具有 n 类型 k 系数的多项式,顺序为最不重要 (x0) 到最重要 (x(n − 1))。那么一种计算度数的方法就像你说的那样,只是这样一个列表的长度减去一个:

degree :: [a] -> Int
degree p = length p - 1

您可以通过引入您自己的类型同义词来重新表述:

type Poly a = [a]

degree :: Poly a -> Int
degree p = length p - 1

此解决方案存在一些错误,例如:

  • 如果给 degree 一个空的系数列表 [] 会发生什么?相反会发生什么?

  • degree [1, 0, 0] 应该计算什么?相反会发生什么? (这就是为什么你复制的代码也需要(Num a, Eq a)。)

在您从 poly 包复制的代码中,像 rawPolyLength 这样的函数正在库的数据表示上运行,也称为 Poly。它有几个不同的构造函数用于不同的表示(列表、装箱向量和未装箱向量)。您没有在代码中定义任何类似的东西。如果你想练习定义函数对列表的操作,只需使用[a],或者添加type Poly a = [a]并使用你自己的Poly a。您可以使用 ListPoly 的函数作为 参考 来了解如何在普通列表上定义这些相同的操作,代码不会完全相同。

与其他语言一样,如果您想使用它们的多项式实现 而无需 必须自己定义它们,则可以使用像 poly 这样的外部包。对于学习 Haskell,建议最初坚持使用 base 包(PreludeData.List 等)以熟悉语言的核心词汇。