1

所以我是学习 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]了 which 返回[3.0],但我想知道是否有办法获得更准确的答案。

提前致谢。

4

5 回答 5

6

欢迎使用 Haskell 和 StackOverflow!

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

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

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

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

let diam c = c / pi
于 2013-10-28T22:57:21.887 回答
3

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

ghci> let diam = 9/pi
于 2013-10-28T22:56:10.580 回答
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]
于 2013-10-28T22:56:09.557 回答
1

怎么样:

let circle = [ 9 / pi ]
于 2013-10-28T22:56:12.633 回答
1

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

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

然后diameterOfCircleWithCircumference 9是 2.8947...

于 2013-10-28T22:58:16.107 回答