在Haskell中,我试图找到负整数的立方根,例如-1,但没有成功.
我使用过(-1)**(1/3),但这会返回一个NaN.我认为这可能与(1/3)分数的类型有关,但使用(1/3 :: Double)也没有成功.
结果,我的问题是如何使用Haskell找到-1的立方根,以便它不返回NaN?
据我了解有关Haskell的褶皱,foldl (-) 0 [1..5]给出的结果是-15通过计算0-1-2-3-4-5,并foldr (-) 0 [1..5]给出了结果-5的计算5-4-3-2-1-0.为什么那么这两个foldl (++) "" ["a", "b", "c"]和foldr (++) "" ["a", "b", "c"]给出的结果"abc",而结果foldr是不,相反,"cba"?
有什么我缺少理解之间的差异foldl和foldr?
haskell functional-programming binary-operators fold associativity
在Haskell中,我使用以下函数来查找多项式的根:
polyNewton :: (Fractional a, Ord a) => Poly a -> a -> a`
polyNewton p s = if (abs(polyValue p s) <= (0 + 1e-10)) then s else polyNewton
p (s - (polyValue p s) / (polyValue (polyDeriv p) s))
Run Code Online (Sandbox Code Playgroud)
其中polyValue是一个函数,它找到多项式p的y值,x值x,而polyDeriv是一个返回多项式p的导数的函数.
对于大多数情况,此代码非常有效,除非多项式没有任何实际根(函数在x轴上方)或者给出了错误的初始猜测.无论如何确定牛顿的方法是否会事先失败,以便我的函数不会无限期地运行?
math haskell functional-programming polynomial-math newtons-method
在Haskell中,我使用的是自定义数据类型Poly a = X | Coef a | Sum (Poly a) (Poly a) | Prod (Poly a) (Poly a) deriving (Show).
因此,多项式(3 + x)^ 2将表示为(Prod (Sum (Coef 3) X) (Sum (Coef 3) X)).
我很难将以这种方式输入的多项式转换为其标准形式的系数列表,我相信它将[9, 6, 1]为(3 + x)^ 2 = 9 + 6x + x ^ 2.
我相信一个可能的解决方案是在我的多项式数据类型上实现一些数学函数,这样我就可以简化输入,但是我没有成功.还有另外一种方法吗?
有人能指出我正确的方向吗?
computer-science haskell functional-programming polynomial-math simplification