【问题标题】:Trying to make a pi approximation in Haskell试图在 Haskell 中做一个 pi 近似值
【发布时间】:2016-07-14 09:24:15
【问题描述】:

好的,所以我试图根据您提供给函数的泰勒展开式中的项数来近似 pi。但是我遇到了很多错误,最后一个是无法推断实例:

这是我的代码:

pie :: Rational -> Rational
pie n = 4.0 * (pie_h n 1.0)

pie_h :: Rational -> Rational
pie_h x y = if(x==0) then 0.0 
             else if ((y mod 2.0)/=0) then (1.0/y)+ pie_h (x-1.0) (y+2.0)
             else (-1.0/y)+(pie_h (x-1.0) (y+2.0))

【问题讨论】:

  • 您应该发布实际的编译器错误,以及您对错误的不理解之处。您是否搜索过相同的错误消息并尝试在那里应用答案? stackoverflow.com/… ?
  • pie_h 的类型有两个参数,而你给的类型只有一个。您正在使用“mod”,它需要 Integral 类型,但您处于合理的上下文中。

标签: haskell pi taylor-series


【解决方案1】:

类型签名错误。你说pie_h 是一个接受单个参数Rational 并返回Rational 的函数,但随后将其定义为接受两个参数xy 的函数。

pie_h :: Rational -> Rational -> Rational
pie_h x y = ...

您还可以通过模式匹配稍微简化这一点,并分解出唯一变化的东西,即第一项的符号。

pie_h 0 _ = 0.0
pie_h x y = (if even y then -1 else 1) / y + pie_h (x - 1.0) (y + 2.0)

【讨论】:

    【解决方案2】:

    如果您将 Leibniz's formula 用于 pi,它不会收敛到 n 上的任何实际值。

    无论效率如何,您都可以以更直接的方式实现它

    定义一个求逆函数(\x->1/x)和交替求和函数(x1-x2+x3...)

    例如,

    import Ratio
    
    invert :: Integer -> Rational
    invert x = 1%x
    
    altsum :: (Num a) => [a] -> a
    altsum [] = 0
    altsum (x:xs) = x - altsum xs
    

    现在,将两者与奇数系列结合起来

    fromRational $ (*) 4 $ altsum $ take 100 $ map invert [1,3..]
    

    给了

    3.131592903558553
    

    您可以将您的 approx_pi 函数定义为

    approx_pi n = (fromRational . (*) 4 . altsum . take n . map invert) [1,3..]     
    

    【讨论】:

      猜你喜欢
      • 2013-05-11
      • 2021-02-22
      • 2022-07-08
      • 1970-01-01
      • 1970-01-01
      • 2017-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多