Haskell实现多项式次数计算函数及编译报错如何解决
问题解决指南
核心错误原因
你当前的报错和你搜到的缺少main函数的问题不属于同一类:你搜到的问题是代码逻辑无错误、仅缺失程序入口导致编译失败,而你现在的报错全部是找不到依赖的类型、构造器和函数,本质是你使用了poly包未对外导出的内部私有实现,且没有导入对应依赖模块。
解决方案1:无需第三方包,自行定义Poly类型练习(推荐新手使用)
你目前处于学习阶段,完全可以自己定义简单的Poly类型实现需求,不需要依赖第三方包,直接就能编译运行:
-- 自定义多项式类型,用列表存储系数 newtype Poly a = Poly [a] deriving (Eq, Show) polyDegree :: (Num a, Eq a) => Poly a -> Int -- 先去掉末尾的0系数,再用长度减1得到次数 polyDegree (Poly cs) = length (dropWhileEnd (== 0) cs) - 1 -- 程序入口,测试多项式x²-1(系数列表为[-1,0,2])的次数 main :: IO () main = print $ polyDegree (Poly [-1, 0, 2])
上述代码直接编译即可输出正确结果2,不需要额外安装任何依赖,适配你使用的在线GHC环境。
解决方案2:如果一定要使用第三方poly包
如果你要使用官方的poly包,需要注意不能直接匹配它的内部私有构造器(ListPoly/VectorPoly/UVectorPoly属于包内部实现,不对外导出),要使用包提供的公开接口:
- 首先在代码头部添加导入声明:
import Data.Poly (Poly, toList, VPoly, toPoly) import qualified Data.Vector as V
- 重写你的
polyDegree实现,用公开的toList方法获取系数列表:
polyDegree :: (Num a, Eq a) => Poly a -> Int polyDegree p = length (dropWhileEnd (== 0) $ toList p) - 1
- 添加main入口测试:
main :: IO () main = print $ polyDegree (toPoly $ V.fromList [-1, 0, 2] :: VPoly Int)
注意:该方案需要你的在线编译器环境已经安装了poly包,否则会报找不到模块的错误。
内容的提问来源于stack exchange,提问作者rubengavidia0x
相关产品推荐
相关产品推荐

