【问题标题】:Haskell list comprehension returns empty?Haskell列表理解返回空?
【发布时间】:2013-10-29 06:58:16
【问题描述】:

所以我是学习 Haskell 的新手(从星期六开始),我从在线书籍中阅读了几章,并写了一个列表理解,以求给定圆周的直径。

ghci> let circle = [(a) | a <- [1..10], 9 / pi == a] 但它返回 [] 我被告知这是因为 [1..10] 只计算整数,而不是 1 到 10 之间的所有实数。

我尝试了ghci> let circle = [(a) | a <- [1..10], round (pi * a) == 9],它返回[3.0],但我想知道是否有办法获得更准确的答案。

提前致谢。

【问题讨论】:

  • 很高兴它没有计算 1 到 10 之间的所有实数。看那个程序永远运行太无聊了。

标签: list haskell list-comprehension


【解决方案1】:

欢迎使用 Haskell 和 StackOverflow!

let circle = [(a) | a <- [1..10], 9 / pi == a]

考虑到 1 到 10 之间的所有实数是 uncountably infinite set(为此向 Georg Cantor 致敬),如果您设法对它们进行列表理解,至少可以说,我会感到惊讶。 :)

您关于此列表为何为空的推理是正确的——9/pi 永远不会等于整数。

除此之外,没有理由为此使用列表推导。你可以通过简单地除以 pi 来做同样的事情:

let diam c = c / pi

【讨论】:

  • 必须给你 +1 才能引用 Cantor。
  • 向我在 Deutsche Mathematiker-Vereinigung 的兄弟们致敬。
  • (不,但说真的,如果你还没有看过康托尔的对角线证明,请阅读the Wikipedia article;在我看来,这是数学中最简单、最漂亮的证明之一)
  • 证明了实数是不可数无限的,然后他指出代数数是可数的,因此必须存在超越数——即使当时没有已知数被证明是超越数。根据我的一位数学老师的说法,他因为这个推论而陷入了可怕的麻烦,并被社区排斥。
  • @ChristianTernus 我认为证明的简单性有点欺骗性。例如,如果您认为 0.011111... = 0.1,那么简单地“在某个位置具有不同的数字”不会使两个数字不同。修补它比你一开始想象的要难。甚至您链接的“实数”部分中的 cmets 似乎也没有完全达到完整的补丁。
【解决方案2】:

这不是列表推导的用途。要得到9 / pi的准确答案,直接计算9 / pi即可。

ghci> let diam = 9/pi

【讨论】:

    【解决方案3】:
    diameter c = c / pi
    

    或者当你在 Haskell 中变得更高级时:

    diameter = (/ pi)
    

    然后你可以调用:

    Prelude> diameter 9
    2.864788975654116
    

    如果您想要周长为 1 到 10 的圆的直径,列表推导可能会很有用,如下所示:

    Prelude> [diameter x | x <- [1..10]]
    [0.3183098861837907,0.6366197723675814,0.954929658551372,1.2732395447351628,1.5915494309189535,1.909859317102744,2.228169203286535,2.5464790894703255,2.864788975654116,3.183098861837907]
    

    【讨论】:

      【解决方案4】:

      怎么样:

      let circle = [ 9 / pi ]
      

      【讨论】:

        【解决方案5】:

        为什么不直接求给定周长的圆的直径?

        diameterOfCircleWithCircumference :: Floating a => a -> a
        diameterOfCircleWithCircumference = (/ pi)
        

        那么diameterOfCircleWithCircumference 9 就是 2.8947...

        【讨论】:

          猜你喜欢
          • 2017-04-01
          • 1970-01-01
          • 2017-02-27
          • 2022-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多