如何在代码中调用一个函数来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
包(Prelude
、Data.List
等)以熟悉语言的核心词汇。
在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 函数的问题,我发现了一个关于简单代数函数的问题
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
包(Prelude
、Data.List
等)以熟悉语言的核心词汇。