Haskell列表理解返回空?

时间:2013-10-28 22:51:13

标签: list haskell list-comprehension

所以我刚开始学习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],但我想知道是否有办法获得更准确的答案。

提前致谢。

5 个答案:

答案 0 :(得分:6)

欢迎使用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 :(得分:3)

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

ghci> let diam = 9/pi

答案 2 :(得分:1)

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]

答案 3 :(得分:1)

怎么样:

let circle = [ 9 / pi ]

答案 4 :(得分:1)

为什么不找到给定周长的圆的直径?

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

然后diameterOfCircleWithCircumference 9是2.8947 ...